はじめに
軽く調べましたが、HiveにおいてテーブルからDDLを生成する方法が
日本語で纏められているサイトが見つからなかったため、纏めました。
※MySQL等は纏められていました。
コマンド自体はMySQLと一緒(show create table)ですので、細かいところを
フォローできればと思います。
前提
DB名は「SampleDB」とする。
テーブル名は「SampleTable」とする。
DDLを作成してみる
コマンドは至って単純である。
hive -e "use SampleDB; show create table SampleTable;"
上記コマンドでDDLを表示できる。
リダイレクトすればDDLファイルの作成が可能である。
hive -e "use SampleDB; show create table SampleTable;" >SampleTable.DDL
注意点
制約なのか、Hue(GUI)においてはDB名指定コマンドで動作しない場合がありました。
動作しない場合は
OK
FAILED:SemanticException [Error 10001]: Table not found SampleTable
と出力されました。
動作する・動作しないのパターンは下記の通り。
【動作するパターン】
Hueでテーブルの存在するDBをデータベース選択し、下記コマンドを実行した場合。
use SampleDB; show create table SampleTable;
または
show create table SampleTable;
【動作しないパターン】
Hueでテーブルの存在するDB以外をデータベース選択し、下記コマンドを実行した場合。
use SampleDB; show create table SampleTable;
作成したDDLについて
作成したDDLファイルをそのまま使用することもできますが、
DB名の指定が存在しないため、お勧めしません。
DDLファイルの読み込みはhive -fコマンドで行えます。
hive -f SampleTable.DDL
DB名の指定が無い状態でテーブルを作成した場合は「default」というDBに
テーブルが作成されます。
作成したDDLファイルは以下のように記載されている。
※一例。作成するときに参照するTABLEによっては一部項目は出力されない。
また、項目の細部が異なる可能性があります。
CREATE TABLE SampleTable(
A_column string,
B_column string,
C_column string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://mycluster/user/woadachi/sample'
TBLPROPERTIES (
'last_modified_by'='woadachi'
'last_modified_time'='XXXXXXXXXX'
'transient_lastDdlTime'='XXXXXXXXXX')
別に削らなくてもいいですが、この中で
「STORED AS INPUTFORMAT」と「OUTPUTFORMAT」と「TBLPROPERTIES」は
削っても問題ないと思います。
なお、DDLファイルの先頭行にDB名を追加すれば、指定のDBに
テーブルを作成することができます。
後、個人的には最終行の行末に「;」が欲しいです。無いと落ち着かない……
use SampleDB;
CREATE TABLE SampleTable(
A_column string,
B_column string,
C_column string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
LOCATION
'hdfs://mycluster/user/woadachi/sample'
;
活用
既存のテーブルのDDLを作成し、管理するためだけでなく、
既存のテーブルをDDL出力して流用することで業務効率化が図れると思います。
また、ここまで紹介した内容をLinuxコマンドと組み合わせてシェル化することで、
任意のDBの任意のテーブルに対して自動でDDLを作成するシェルを作成することも
可能だと思います。