hadoop
shell
hive
Hdfs
hiveql

既に存在するHiveのテーブルからDDLを作成する方法

More than 1 year has passed since last update.

はじめに

軽く調べましたが、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を作成するシェルを作成することも
可能だと思います。