hiveノート-静的パーティションと動的パーティション

3618 ワード

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;
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を推奨し、データの重複を回避します.
【@若沢ビッグデータより】