I.概要
全体的にハイブ4つのテーブルがあります:外部テーブル、内部テーブル(管理表)、パーティションテーブル、バレルのテーブルが。さまざまな要件に対応します。ここでは主に、各種の除外テーブルの作成、およびロード・データ方法。
第二に、特定のコンテンツ
1.内部表
内部テーブルと負荷データを作成します。
-
作成(テーブルemp_innerを
-
EMPNO int型、
-
ENAMEの 文字列、
-
仕事の 文字列、
-
MGRの int型、
-
HIREDATE 文字列、
-
SAL 、ダブル
-
COMMの ダブル、
-
DEPTNO のint
-
)
-
行形式区切りフィールド終端では「\ t」の
-
LOCATION '/user/hive/warehouse/hadoop.db/emp';
2.外部表
(1)概要:
ログ分析が一緒に複数のチームを必要とする場合には、分析が行われた後に作成されたテーブルを削除することができます。しかし、通常のテーブルの削除は、他のチームの分析に影響を与える可能性があり、データを削除して、データを簡単に削除することはできませんログに記録されます。そのため、外部表の必要性は、それが対応するHDFS上のデータを削除しない、外部表を削除します。
(2)外部のテーブルを作成します
-
作成EXTERNAL (テーブルdept_extを
-
DEPTNO int型、
-
DNAME 文字列、
-
LOC の文字列
-
)
-
行の形式は、区切られたフィールドの終了により、「\ tを」;
-
ロード・データのローカルINPATH 「/opt/datas/dept.txt」にテーブルdept_ext。
(3)は、外側テーブルと内側テーブルとの間の差を比較し
、外部テーブルを削除するために、データが変更されない、単にメタデータのMySQLを変更するが、内部テーブル(管理テーブル)を削除され、データは削除されます。
要約:の内部と外側テーブルハイブ差
1時)テーブルを作成する:あなたが内部テーブルを作成すると、データウェアハウスのデータポイントのパスに移動します。あなたは、外部表を作成した場合、レコードのみデータ・パス、データが任意の位置にありません変更。
2)あなたは、テーブルを削除する場合:削除されたテーブルでは、内部テーブルおよびデータのためのメタデータが一緒に削除され、外部のテーブルデータのみを削除しないでください、メタデータを削除します。ソース・データの共有を容易にするために、データのような外部のテーブル比較的安全で、より柔軟な組織
3、一時テーブル
(1)それは何ですか
中間解析は、ハイブクライアントを閉じた後、一時テーブルが消えます。主に設定された中間結果を格納するために重要な、重要でないテーブルではありません。
(2)一時テーブルを作成し、データをロードします
-
作成TEMPORARY (テーブルdept_tmpを
-
DEPTNO int型、
-
DNAME 文字列、
-
LOC の文字列
-
)
-
行の形式は、区切られたフィールドの終了により、「\ tを」;
-
-
ロード・データのローカルINPATH 「/opt/datas/dept.txt」にテーブルdept_tmp。
(3)表示位置情報
-
DESCフォーマットさdept_tmp。
-
場所:HDFS:/ /172.19.199.187:8020/tmp /ハイブ/ Hadoopの/68174383-f427-4629-9707-0ab1c9b07726/_tmp_space.db/d872efec- 1294- 48bは0- 9071- 31cf98d4640 0
-
表の 種類:MANAGED_TABLE
図4に示すように、パーティションテーブル[***]
(1)それは何ですか
共通テーブル:日付=「20171209」ログから*を選択し、プロセスが実行されます。データクエリの完全なテーブルを、フィルタリング操作の前に。
パーティションテーブルは:日付=「20171209」ログから選択*、プロセスは実行されます、対応するファイル内のデータパスが直接ロード。大量のデータに適した、あなたはすぐにデータがパーティションによって照会されるように見つけることができ、パーティションテーブルの主な役割は、クエリの効率を改善することです。
(2)パーティションと負荷データを作成します
-
作成(テーブルemp_partを
-
EMPNO int型、
-
ENAMEの 文字列、
-
仕事の 文字列、
-
MGRの int型、
-
HIREDATE 文字列、
-
SAL 、ダブル
-
COMMの ダブル、
-
DEPTNO のint
-
)パーティション (で`datetime`の文字列)
-
行の形式は、区切られたフィールドの終了により、「\ tを」;
-
-
ロード・データのローカルINPATH '/opt/datas/emp.txt' にテーブルemp_partのパーティション(`datetime` = '20171209')。
-
ロード・データのローカルINPATH '/opt/datas/emp.txt' にテーブルemp_partのパーティション(`datetime` = '20171208')。
-
[フォルダは、二つのHDFSに形成され、emp.txt内部に格納されています]
-
/user/hive/warehouse/hadoop.db/emp_part/datetime=20171208
-
/user/hive/warehouse/hadoop.db/emp_part/datetime=20171209
-
-
クエリ結果:
-
*選択emp_partからどこ`datetime` = '20171209';
(3)パーティションと2つのロードデータを作成します
-
作成(テーブルemp_part2を
-
EMPNO int型、
-
ENAMEの 文字列、
-
仕事の 文字列、
-
MGRの int型、
-
HIREDATE 文字列、
-
SAL 、ダブル
-
COMMの ダブル、
-
DEPTNO のint
-
)分割 により(`datetime` 文字列、時間の文字列)
-
行の形式は、区切られたフィールドの終了により、「\ tを」;
-
-
ロード・データのローカルINPATH '/opt/datas/emp.txt' にテーブルemp_part2のパーティション(`datetime` = '20171209'、時間= '01')。
-
-
ロード・データのローカルINPATH '/opt/datas/emp.txt' にテーブルemp_part2のパーティション(`datetime` = '20171209'、時間= '02')。
-
[HDFSには、ディレクトリを形成します]
-
/user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=01
-
/user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=02
クエリ結果:
-
- " 選択* emp_part2から` datetime` = '20171209';
-
/user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209のデータ(すなわち、二回emp.txtデータ)のすべてを見ます
-
- " 選択* emp_part2から` datetime` = '20171209' と時間= '01';
-
/user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=01内のすべてのデータ(すなわちemp.txtデータ)を見ます
(4)(削除だけメタデータを削除する場合、データは削除されません)外部のパーティションテーブルを作成します
-
作成EXTERNAL (テーブルEMP_TESTを
-
EMPNO int型、
-
ENAMEの 文字列、
-
仕事の 文字列、
-
MGRの int型、
-
HIREDATE 文字列、
-
SAL 、ダブル
-
COMMの ダブル、
-
DEPTNO のint
-
)
-
PARTITIONED BY(日付文字列、時間の文字列)
-
行の形式は、区切られたフィールドの終了により、「\ tを」;
(5)パーティションテーブルのデータをロードする方法を
ロードコマンドによって(A)(パーティションを指定)を直接選択し、分割されたテーブルにデータをロードを照会することができます。
load data local inpath '/opt/datas/emp.txt' into table emp_part2 partition(`datetime`='20171209',hour='01');
手動でディレクトリ/user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=03を作成する(B)は、データテーブルを入れ選択クエリは、クエリ見えます。その後、元のデータベースのMySQLデータベースへのパスを変更します。
alter table emp_part2 add partition(`datetime`='20171209',hour='03');
図5に示すように、バレルテーブル
(1)ケースを使用
データは、深刻なデータの偏り、不均一な分布を持っているが、比較的に言えば、各バケット内のデータの量がより均等になります。バケツがあり、最適化されたバケットの間にその他のお問い合わせに参加します。
(2)を作成し、使用
まず第一に、
set hive.enforce.bucketing = true;
その後、
-
作成(テーブルemp_buを
-
EMPNO int型、
-
ENAMEの 文字列、
-
仕事の 文字列、
-
MGRの int型、
-
HIREDATE 文字列、
-
SAL 、ダブル
-
COMMの ダブル、
-
DEPTNO のint
-
)CLUSTERED BY(DEPTNO)INTO 4つのバケット
-
行の形式は、区切られたフィールドの終了により、「\ tを」;
最後に、負荷データは、挿入を使用します
insert overwrite table emp_bu_2 select * from emp;
也可以指定分区写入 insert overwrite