hiveノート-静的パーティションと動的パーティション
1、静的パーティション
CREATE TABLE emp_dept_partition(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double
)
PARTITIONED BY (deptno int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";
注記:静的パーティション表にパーティションフィールドを含めることはできません.そうしないと、FAILED:SemanticException[Error 10035]:Column repeated in partioning columnsとエラーが表示されます.
データのインポート
INSERT OVERWRITE TABLE emp_dept_partition PARTITION (deptno=10) IF NOT EXISTS select empno, ename, job, mgr, hiredate, sal, comm from emp where deptno=20;
なぜemp_dept_partitionにはdeptnoというフィールドはありませんが、クエリー時に表示されますか?メタデータとして保存されているのではないでしょうか.
Insert文では、empからdeptnoが20のデータを見つけてemp_にインポートします.dept_10パーティションフィールドの値を10に設定します.これは明らかに不合理であり、検証メカニズムも欠けています.
今mysqlからメタデータを修正し、データを10から20に変更します.
パーティションフィールドデータがメタデータとして保持されていることを実証した.
2、ダイナミックパーティションINSERT OVERWRITE TABLE emp_dept_partition PARTITION (deptno) select empno, ename, job, mgr, hiredate, sal, comm,deptno from emp;パーティションフィールドは、最後のフィールドの最初の実行時にエラーを報告する必要があります:FAILED:SemanticException[Error 10096]:D y n amic partition strict mode requires at least one static partition column.To turn this off set hive.exec.dynamic.partition.mode=nonstrictヒント入力コマンドに従って解決:set hive.exec.dynamic.partition.mode=nonstrict
メタデータのチェック
自動的に3つのパーティションが追加され、deptnoは対応できます.
4、まとめ
ダイナミックパーティションを使用すると、テーブルをスマートにロードできますが、静的パーティション値はダイナミックパーティション値の前にある必要があります.したがって、ダイナミックパーティションの使用を推奨し、insertによるパーティションの使用はOVERWRITEを推奨し、データの重複を回避します.
【@若沢ビッグデータより】
CREATE TABLE emp_dept_partition(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double
)
PARTITIONED BY (deptno int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";
注記:静的パーティション表にパーティションフィールドを含めることはできません.そうしないと、FAILED:SemanticException[Error 10035]:Column repeated in partioning columnsとエラーが表示されます.
データのインポート
INSERT OVERWRITE TABLE emp_dept_partition PARTITION (deptno=10) IF NOT EXISTS select empno, ename, job, mgr, hiredate, sal, comm from emp where deptno=20;
hive> select * from emp_dept_partition;
OK
7369 SMITH CLERK 7902 1980/12/17 800.0 NULL 10
7566 JONES MANAGER 7839 1981/4/2 2975.0 NULL 10
7788 SCOTT ANALYST 7566 1987/4/19 3000.0 NULL 10
7876 ADAMS CLERK 7788 1987/5/23 1100.0 NULL 10
7902 FORD ANALYST 7566 1981/12/3 3000.0 NULL 10
Time taken: 0.083 seconds, Fetched: 5 row(s)
なぜemp_dept_partitionにはdeptnoというフィールドはありませんが、クエリー時に表示されますか?メタデータとして保存されているのではないでしょうか.
Insert文では、empからdeptnoが20のデータを見つけてemp_にインポートします.dept_10パーティションフィールドの値を10に設定します.これは明らかに不合理であり、検証メカニズムも欠けています.
今mysqlからメタデータを修正し、データを10から20に変更します.
mysql> select a.TBL_ID, b.PART_ID from partition_keys a, partitions b where a.TBL_ID=(select TBL_ID from tbls where TBL_NAME='emp_dept_partition') and a.TBL_ID = b.TBL_ID;
+--------+---------+
| TBL_ID | PART_ID |
+--------+---------+
| 15 | 6 |
+--------+---------+
1 row in set (0.00 sec)
mysql> update partitions set PART_NAME='deptno=20' where PART_ID=6;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
mysql> update partition_key_vals set PART_KEY_VAL='20' where PART_ID=6;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
hive> select * from emp_dept_partition;
OK
7369 SMITH CLERK 7902 1980/12/17 800.0 NULL 20
7566 JONES MANAGER 7839 1981/4/2 2975.0 NULL 20
7788 SCOTT ANALYST 7566 1987/4/19 3000.0 NULL 20
7876 ADAMS CLERK 7788 1987/5/23 1100.0 NULL 20
7902 FORD ANALYST 7566 1981/12/3 3000.0 NULL 20
Time taken: 0.093 seconds, Fetched: 5 row(s)
パーティションフィールドデータがメタデータとして保持されていることを実証した.
2、ダイナミックパーティションINSERT OVERWRITE TABLE emp_dept_partition PARTITION (deptno) select empno, ename, job, mgr, hiredate, sal, comm,deptno from emp;パーティションフィールドは、最後のフィールドの最初の実行時にエラーを報告する必要があります:FAILED:SemanticException[Error 10096]:D y n amic partition strict mode requires at least one static partition column.To turn this off set hive.exec.dynamic.partition.mode=nonstrictヒント入力コマンドに従って解決:set hive.exec.dynamic.partition.mode=nonstrict
メタデータのチェック
mysql> select a.TBL_ID, b.PART_ID ,b.PART_NAME from partition_keys a, partitions b where a.TBL_ID=(select TBL_ID from tbls where TBL_NAME='emp_dept_partition') and a.TBL_ID = b.TBL_ID;
+--------+---------+-----------+
| TBL_ID | PART_ID | PART_NAME |
+--------+---------+-----------+
| 15 | 6 | deptno=20 |
| 15 | 7 | deptno=30 |
| 15 | 8 | deptno=10 |
+--------+---------+-----------+
3 rows in set (0.00 sec)
自動的に3つのパーティションが追加され、deptnoは対応できます.
4、まとめ
ダイナミックパーティションを使用すると、テーブルをスマートにロードできますが、静的パーティション値はダイナミックパーティション値の前にある必要があります.したがって、ダイナミックパーティションの使用を推奨し、insertによるパーティションの使用はOVERWRITEを推奨し、データの重複を回避します.
【@若沢ビッグデータより】