Hive(4)Hiveデータベース定義DDL言語

4. DDLデータ定義

4.1データベースを作成する

  • データベースを作成します。HDFS上のデータベースのデフォルトのストレージパスは/opt/hive/warehouse/*.dbです
create database hivetest;
  • 作成するデータベースのエラーを回避するため、存在しない場合の判断を追加します。(标准写法)
create database if not exists hivetest;

image-20200916163107048

  • データベースを作成し、データベースがHDFSに保存されている場所を指定する
create database if not exists hivetest location 'hdfs路径';

image-20200916163354544

4.2データベースへのクエリ

  • データベースを表示
show databases;

image-20200916165802686

クエリデータベースをフィルタリングして表示する

show databases like 'hivetest*';

image-20200916165936990

  • データベースの詳細を表示する
desc database hivetest;

image-20200916170340247

  • 現在のデータベースを切り替える
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;

image-20200916201159535

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);

image-20200916231329604

image-20200916230900306

image-20200916230917167

4。パーティションテーブルのデータをクエリする

単一パーティションクエリ

select * from dept_partition where month='201709';

image-20200916231504421

マルチパーティション共同クエリ

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);

image-20200917192015967

image-20200917192028686

4.6.3テーブルの削除

drop table dept_partition;

注:このコマンドだけで外部テーブルを削除することはできません。このコマンドは、外部テーブルのメタデータのみを削除できます。hdfsのデータを削除する方法はありません。外部テーブルを完全に削除する必要がある場合は、次の方法があります。

  • オプション1:内部テーブルに変換して削除する
ALTER TABLE xxx SET TBLPROPERTIES('EXTERNAL'='False');

drop table xxx;
  • オプション2:メタデータを削除してから、hdfsを使用してデータを削除する

おすすめ

転載: blog.csdn.net/zmzdmx/article/details/108651190