記事ディレクトリ
4. DDLデータ定義
4.1データベースを作成する
- データベースを作成します。HDFS上のデータベースのデフォルトのストレージパスは/opt/hive/warehouse/*.dbです
create database hivetest;
- 作成するデータベースのエラーを回避するため、存在しない場合の判断を追加します。
(标准写法)
create database if not exists hivetest;
- データベースを作成し、データベースがHDFSに保存されている場所を指定する
create database if not exists hivetest location 'hdfs路径';
4.2データベースへのクエリ
- データベースを表示
show databases;
クエリデータベースをフィルタリングして表示する
show databases like 'hivetest*';
- データベースの詳細を表示する
desc database hivetest;
- 現在のデータベースを切り替える
use 目标数据库名称;
4.3データベースを削除する
- 空のデータベースを削除
drop database 库名;
- 削除されたデータベースが存在しない場合は、存在する場合に使用して、データベースが存在するかどうかを判断するのが最適です。
drop database if exists 库名;
- データベースが空でない場合は、cascadeコマンドを使用して強制的に削除できます。
drop database 库名 cascade;
4.4テーブルを作成する
- テーブル構築構文
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
- フィールド説明
(1)CREATE TABLEは、指定された名前でテーブルを作成します。同じ名前のテーブルがすでに存在する場合、例外がスローされます。ユーザーはIF NOT EXISTSオプションを使用して、この例外を無視できます。
(2)EXTERNALキーワードを使用すると、ユーザーは外部テーブルを作成し、テーブルの作成中に実際のデータ(LOCATION)へのパスを指定できますHive创建内部表时,会将数据移动到数据仓库指向的路径
。外部テーブルが作成された場合、データの場所への変更はなく、データが配置されているパスのみが記録されます。テーブルを削除すると、内部テーブルのメタデータとデータが一緒に削除されますが、外部テーブルではメタデータのみが削除され、データは削除されません。
(3)コメント:テーブルと列にメモを追加します。
(4)PARTITIONED BYによるパーティションテーブルの作成
(5)CLUSTERED BYはバケットテーブルを作成します
(6)SORTED BYは一般的に使用されません
(7)行フォーマット
制限あり[文字で終了したフィールド] [文字で終了したコレクションアイテム]
[文字によって終了するマップキー] [文字によって終了する行]
| SERDE serde_name [WITH SERDEPROPERTIES(property_name = property_value、property_name = property_value、…)]
ユーザーは、SerDeをカスタマイズするか、テーブルを構築するときに組み込みのSerDeを使用できます。ROW FORMATまたはROW FORMAT DELIMITEDが指定されていない場合、組み込みのSerDeが使用されます。テーブルを作成する場合、ユーザーはテーブルの列も指定する必要があります。テーブルの列を指定する場合、ユーザーはカスタムSerDeも指定します。Hiveは、SerDeを介してテーブルの特定の列データを決定します。
SerDeはSerialize / Deserilizeの略で、シリアライズとデシリアライズに使用されます。
(8)STORED AS指定ストレージファイルタイプ
一般的に使用されるストレージファイルの種類:SEQUENCEFILE(バイナリシーケンスファイル)、TEXTFILE(テキスト)、RCFILE(列ストレージ形式ファイル)
ファイルデータがプレーンテキストの場合は、STORED AS TEXTFILEを使用できます。データを圧縮する必要がある場合は、STORED AS SEQUENCEFILEを使用します。
(9)LOCATION :指定表在HDFS上的存储位置。
(10)LIKEを使用すると、ユーザーは既存のテーブル構造をコピーできますが、データはコピーされません。
4.4.1内部表
デフォルトで作成されるテーブルは、いわゆる管理テーブルであり、内部テーブルと呼ばれることもあります。この種類のテーブルがあるため、Hiveは(多かれ少なかれ)データのライフサイクルを制御します。デフォルトでは、Hiveはこれらのテーブルのデータを構成アイテムhive.metastore.warehouse.dirによって定義されたディレクトリのサブディレクトリ(たとえば、/ opt / hive / warehouse)に保存します。当我们删除一个管理表时,Hive也会删除这个表中数据。
管理テーブルは、他のツールとのデータの共有には適していません。
- 通常の作成テーブル
create table if not exists student2(
id int, name string
)
row format delimited fields terminated by '\t';
- クエリ結果に基づいてテーブルを作成します(クエリ結果は新しく作成されたテーブルに追加されます)
create table if not exists student3 as select id, name from student;
- 既存のテーブル構造に基づいてテーブルを作成する
create table if not exists student4 like student;
- ルックアップテーブルのタイプ
desc formatted student2;
4.4.2外部表
テーブルは外部テーブルであるため、Hiveはこのデータを完全に所有しているとは考えていません。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
- 管理テーブルと外部テーブルのシナリオを使用する
収集されたWebサイトログは、毎日HDFSテキストファイルに定期的にストリーミングされます。外部テーブル(元のログテーブル)に基づいて多くの統計分析を実行します。使用される中間テーブルと結果テーブルは内部テーブルに格納され、データはSELECT + INSERTによって内部テーブルに入ります。
詳細なケース
従業員の外部テーブルを作成し、データをテーブルにインポートします。
Michael|Montreal,Toronto|Male,30|DB:80|Product:DeveloperLead
Will|Montreal|Male,35|Perl:85|Product:Lead,Test:Lead
Shelley|New York|Female,27|Python:80|Test:Lead,COE:Architect
Lucy|Vancouver|Female,57|Sales:89|Sales:Lead
- テーブル作成ステートメント
従業員テーブルを作成する
create external table if not exists employee(
name string,
address array<string>,
personalInfo array<string>,
technol map<string,int>,
jobs map<string,string>)
row format delimited
fields terminated by '|'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n';
データを外部テーブルにインポートする
load data local inpath '/root/employee.txt' into table employee;
検索結果
select * from employee;
4.4.3管理テーブルと外部テーブル間の相互変換
- 内部テーブルstudent2を外部テーブルとして変更します。
alter table student2 set tblproperties('EXTERNAL'='TRUE');
- 外部テーブルstudent2を内部テーブルとして変更します
alter table student2 set tblproperties('EXTERNAL'='FALSE');
注意:('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')为固定写法,区分大小写!
4.5パーティションテーブル(パーティション)
パーティションテーブルは実際にはHDFSファイルシステム上の独立したフォルダーに対応しており、パーティションのすべてのデータファイルはこのフォルダーの下にあります。Hive中的分区就是分目录
、ビジネスニーズに応じて、大きなデータセットを小さなデータセットに分割します。クエリを実行するときは、WHERE句の式を使用して、クエリに必要な指定されたパーティションを選択します。このクエリの効率は大幅に向上します。
4.5.1パーティションテーブルの基本操作
データ
10,ACCOUNTING,NEW YORK
10,ACCOUNTING,NEW YORK
10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
20,RESEARCH,DALLAS
20,RESEARCH,DALLAS
30,SALES,CHICAGO
30,SALES,CHICAGO
1。パーティションテーブルを導入します(ログは日付に従って管理する必要があります)
/opt/hive/warehouse/log_partition/20170702/20170702.log
/opt/hive/warehouse/log_partition/20170703/20170703.log
/opt/hive/warehouse/log_partition/20170704/20170704.log
2。パーティションテーブル構文の作成
create table dept_partition(
deptno int, dname string, loc string
)
partitioned by (month string)
row format delimited fields terminated by ',';
3。パーティションテーブルにデータを読み込む
load data local inpath '/opt/dept.txt' into table default.dept_partition partition(month='201707’);
load data local inpath '/opt/dept.txt' into table default.dept_partition partition(month='201708’);
load data local inpath '/opt/dept.txt' into table default.dept_partition partition(month='201709’);
4。パーティションテーブルのデータをクエリする
単一パーティションクエリ
select * from dept_partition where month='201709';
マルチパーティション共同クエリ
select * from dept_partition where month='201709'
union
select * from dept_partition where month='201708'
union
select * from dept_partition where month='201707';
注意
Hive 1.2.0より前のバージョンはUNION ALLのみをサポートしており、重複する行は削除されません。
Hive 1.2.0以降では、UNIONのデフォルトの動作は、結果から重複行を削除することです。
5。パーティションを増やす
alter table dept_partition add partition(month='201706') ;
alter table dept_partition add partition(month='201705') ,partition(month='201704');
6。パーティションを削除
alter table dept_partition drop partition (month='201704');
alter table dept_partition drop partition (month='201705'), partition (month='201706')
7。パーティションテーブルにあるパーティションの数を表示する
show partitions dept_partition;
8。パーティションテーブルの構造を表示する
desc formatted dept_partition;
4.6テーブルの変更
4.6.1テーブルの名前変更
- 文法
ALTER TABLE table_name RENAME TO new_table_name
- インスタンス
alter table dept_partition2 rename to dept_partition3;
4.6.2列情報の追加/変更/置換
- 文法
列を更新
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
列を追加および置換する
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
注:ADDは新しいフィールドを追加することを意味し、フィールドの位置はすべての列の後ろ(パーティション列の前)にあります。REPLACEはテーブルのすべてのフィールドを置き換えることを意味します。
- 場合
列を追加
alter table dept_partition add columns(deptdesc string);
列を更新
alter table dept_partition change column deptdesc desc int;
カラムを交換
alter table dept_partition replace columns(deptno string, dname string, loc string);
4.6.3テーブルの削除
drop table dept_partition;
注:このコマンドだけで外部テーブルを削除することはできません。このコマンドは、外部テーブルのメタデータのみを削除できます。hdfsのデータを削除する方法はありません。外部テーブルを完全に削除する必要がある場合は、次の方法があります。
- オプション1:内部テーブルに変換して削除する
ALTER TABLE xxx SET TBLPROPERTIES('EXTERNAL'='False');
drop table xxx;
- オプション2:メタデータを削除してから、hdfsを使用してデータを削除する