目次
データのタイプ
基本的なデータ型
Hiveデータ型 | Javaデータ型 | 長さ | 例 |
---|---|---|---|
TINYINT | バイト | 1バイトの符号付き整数 | 20 |
SMALINT | ショート | 2バイトの符号付き整数 | 20 |
INT | int | 4バイトの符号付き整数 | 20 |
大きな | 長いです | 8バイトの符号付き整数 | 20 |
ブール | ブール | ブール型、trueまたはfalse | 真/偽 |
浮く | 浮く | 単精度浮動小数点 | 3.14159 |
ダブル | ダブル | 倍精度浮動小数点 | 3.14159 |
ストリング | ストリング | 文字列、文字セットを指定でき、一重引用符または二重引用符を使用できます | 'おはようこんにちは" |
タイムスタンプ | 時間タイプ | ||
バイナリ | バイト配列 |
HiveのString型は、可変文字列であるデータベースのvarchar型と同等です。ただし、最大でいくつの文字を保存できるかを示すことはできません。理論的には2GBの文字を保存できます。
コレクションデータタイプ
データのタイプ | 解説 |
---|---|
構造 | C言語の構造体と同様に、要素のコンテンツには「ドット」記号を使用してアクセスできます。たとえば、列のデータ型がSTRUCT {first STRING、last STRING}の場合、最初の要素はフィールド.firstで参照できます。 |
地図 | MAPはキーと値のペアのタプルのセットであり、配列表記を使用してデータにアクセスできます。たとえば、列のデータ型がMAPで、キーと値のペアが「first」->「John」と「last」->「Doe」の場合、最後のフィールドはフィールド名['last']で取得できます。素子 |
アレイ | 配列は、同じタイプと名前を持つ変数のコレクションです。これらの変数は配列の要素と呼ばれ、各配列要素にはゼロから始まる番号があります。たとえば、配列の値が['John'、 'Doe']の場合、2番目の要素は配列名[1]で参照できます。 |
create table test(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
row format delimited
fields terminated by ',' 列分隔符
collection items terminated by '_' MAP,STRUCT,和ARRAY 的分隔符(数据分割符号)
map keys terminated by ':' MAP中的key与value的分隔符
lines terminated by '\n'; 行分隔符
型変換
Hiveの基本的なデータ型は、Javaの型変換と同様に、暗黙的に変換できます。たとえば、TINYINTは自動的にINT型に変換されます。ただし、Hiveは逆変換を実行しません(たとえば、INTは自動的にTINYINTタイプに変換されません)。
暗黙の型変換規則は次のとおりです
- TINYINTはINTに変換でき、INTはBIGINTに変換できるなど、整数型は暗黙的により広い型に変換できます。
- すべての整数型、FLOATおよびSTRING型は暗黙的にDOUBLEに変換できます。
- TINYINT、SMALLINT、INTはすべてFLOATに変換できます。
- BOOLEANタイプは他のタイプに変換できません。
CAST操作を 使用して、データ型変換を表示します。たとえば、CAST( '1' AS INT)は文字列 '1'を整数1に変換します。CAST( 'X' AS INT)の実行など、型変換が失敗した場合、式は次を返しますNULL値はNULLです。
DDLデータ定義言語
データベースを作成する
create database if not exists hive;
データベースを作成し、データベースがHDFSに保存されている場所を指定します。*。dbフォルダーは表示されません。
Create database if not exists hive location '/hive';
クエリデータベース
データベースを表示
show datatbases;
データベース情報を表示する
desc database hive;
データベースの詳細を表示
desc database extended hive;
データベースを変更および削除する
データベース名やデータベースが配置されているディレクトリの場所など、データベースの他のメタデータ情報は変更できません。
alter database hive set dbproperties('createtime'='20200528');
空のデータベースを削除
drop database if exists hive;
使用カスケード空のデータベースを削除するカスケード
drop database if exists hive cascade;
テーブルを作成
テーブル構文を作成する
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]
通常の作成テーブル
create table if not exists student(
id int, name string
)
row format delimited fields terminated by '\t'
stored as textfile
location '/hive/warehouse/student';
クエリ結果に基づいてテーブルを作成します(クエリ結果は新しく作成されたテーブルに追加されます)
create table if not exists student as select id,name from person;
既存のテーブル構造に基づいてテーブルを作成する
create table if not exists student like person;
ルックアップテーブルのタイプ
desc formatted student;
内部および外部テーブル
デフォルトで作成されるテーブルは、いわゆる管理テーブルであり、内部テーブルと呼ばれることもあります。管理テーブルを削除すると、Hiveはこのテーブルのデータも削除します。
EXTERNALキーワードを使用すると、ユーザーは外部テーブルを作成し、テーブルの作成中に実際のデータ(LOCATION)へのパスを指定できます。Hiveが内部テーブルを作成すると、データウェアハウスが指すパスにデータが移動します。外部テーブルが作成されている場合のみ、データが配置されているパスを記録し、データの場所を変更しないでください。テーブルを削除すると、内部テーブルのメタデータとデータが一緒に削除されますが、外部テーブルではメタデータのみが削除され、データは削除されません。
アプリケーションシナリオ:収集されたWebサイトログは、毎日HDFSテキストファイルに定期的にストリーミングされます。外部テーブル(元のログテーブル)に基づいて多くの統計分析を実行します。使用される中間テーブルと結果テーブルは内部テーブルに格納され、データはSELECT + INSERTによって内部テーブルに入ります。
管理テーブルと外部テーブル間の変換では、( 'EXTERNAL' = 'TRUE')および( 'EXTERNAL' = 'FALSE')は大文字にする必要があります。
alter table student set tblproperties('EXTERNAL'='TRUE');
パーティションテーブル
パーティションテーブルは実際にはHDFSファイルシステム上の独立したフォルダーに対応しており、パーティションのすべてのデータファイルはこのフォルダーの下にあります。Hiveのパーティションはサブディレクトリであり、ビジネスニーズに応じて、大きなデータセットを小さなデータセットに分割します。クエリを実行するときは、WHERE句の式を使用して、クエリで必要な指定のパーティションを選択します。このクエリの効率が大幅に向上します。パーティションテーブルの形式は次のとおりです。
/hive/warehouse/log_partition/20170702/20170702.log
/hive/warehouse/log_partition/20170703/20170703.log
/hive/warehouse/log_partition/20170704/20170704.log
パーティションテーブルを作成する
create table log_partition(
dname string, loc string
)
partitioned by (month string)
row format delimited fields terminated by '\t';
パーティションテーブルにデータを読み込む
load data local inpath '/opt/test.txt' into table log_partition partition(month='202005');
パーティションテーブルのデータをクエリする
select * from loc_partition where month='202005';
パーティションを増やす
alter table log_partition add partition(month='202005');
スペースで区切られた複数のパーティションを作成する
alter table log_partition add partition(month='202005') partition(month='202006');
パーティションを削除
alter table log_partition drop partition(month='202005');
コンマで区切られた複数のパーティションを削除する
alter table log_partition drop partition(month='202005'),partition(month='202006');
パーティションテーブルにあるパーティションの数を表示する
show partitions log_partition;
パーティションテーブルの構造を表示する
desc formatted log_partition;
セカンダリパーティションテーブルを作成する
create table log_partition(
dname string, loc string
)
partitioned by (month string,day string)
row format delimited fields terminated by '\t';
セカンダリパーティションテーブルにデータを読み込む
load data local inpath '/opt/test.txt' into table log_partition partition(month='202005',day='28');
データとメタデータ
Hiveクエリデータは、まずメタデータにクエリを実行し、次にメタデータに基づいて実際のデータを取得します。Hiveクエリには2つの条件があります。1.メタデータが存在する。2.実際のデータがあります。最初のデータであるか最初のメタデータであるかに関係なく、両方の条件が満たされている限り、データを照会できます。それらの1つが欠落している場合、データを照会することはできません。
hadoop fs -mkdir -p /hive/warehouse/test
hadoop fs -put /opt/test.txt /hive/warehouse/test
msck repair table test;
select * from test;
テーブルを修正
テーブルの名前を変更
alter table student rename to pupil;
列を追加
alter table pupil add column(grade int);
列を更新し、タイプを追加する必要があることに注意してください
alter table pupil change column name last_name string;
列を置き換えます。REPLACEは、テーブル内のすべてのフィールドを置き換えます。
alter table pupil replace column(id int,name string);
テーブルを削除
drop table pupil;
DMLデータ操作
データのインポート
- テーブルにデータをロードする(Load)
ローカルファイルをテーブルハイブに読み込む
load data local inpath '/opt/test.txt' into table hive;
HDFSファイルをテーブルハイブに読み込む
load data inpath '/test.txt' into table hive;
データをロードして、テーブル内の既存のデータを上書きします
load data inpath '/test.txt' overwrite into table hive;
- テーブルにデータを挿入する(Insert)
基本的な挿入データ
insert into table student partition(month='202005') values(1,'abc');
insert into table student partition(month='202005') select * from table;
テーブルを作成してデータをロードする(選択時)
create table if not exists student as select id, name from student;
テーブルの作成時に場所を介してデータをロードするパスを指定します
create table if not exists student(
id int, name string
)
row format delimited fields terminated by '\t'
location '/hive/warehouse/student';
hadoop fs -put /opt/test.txt /hive/warehouse/student
select * from student;
指定したHiveテーブルにデータをインポートします。注:最初にexportを使用してデータをエクスポートしてからインポートしてください。エクスポートはテーブルをエクスポートするときにメタデータファイルを生成し、インポートにはメタデータが必要なためです。
export table temptable to '/hive/warehouse/export/student';
import table student partition(month='202005') from '/hive/warehouse/export/student';
データ出力
insertはクエリの結果をローカルにエクスポートします
insert overwrite local directory '/opt/test' select * from student;
クエリ結果をフォーマットしてローカルにエクスポートする
insert overwrite local directory '/opt/test' row format delimited fields terminated by '\t' select * from student;
クエリの結果をHDFSにエクスポートする(ローカルなし)
insert overwrite directory '/opt/test' select * from student;
Hadoopコマンドをローカルにエクスポートする
hadoop fs -get /hive/warehouse/test.txt /opt/test.txt
Hive Shellコマンドのエクスポート
hive -e 'select * from student;' > /opt/student.txt;
HDFSにエクスポート
export table student to /hive/warehouse/student;
テーブルデータをクリア(切り捨て)
Truncateは管理テーブルのみを削除でき、外部テーブルのデータは削除できません
truncate table student;