この記事について
Impala でテーブル作成する方法をいつも忘れそうになるのでメモ。
前提
S3
S3 の特定フォルダに、スキーマの揃ったデータが入っていること
(CSV, AVRO, PARQUET の場合を掲載)
データ形式によって若干定義が異なる
Impala
Cloudera Data Platform (Public Cloud) の CDW Hue を利用
CSVの場合
CSVの場合
-- Hive外部テーブルの作成
CREATE EXTERNAL TABLE test_table
(
-- ここのスキーマは、S3で保持するデータのスキーマに合わせる
actor_id int,
first_name string,
last_name string,
last_update string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' -- 項目の区切り文字は','(カンマ)
LINES TERMINATED BY '\n' -- 行の区切り文字は改行コード
STORED AS TEXTFILE -- ファイルフォーマットはテキストファイル
LOCATION -- ファイルの保存場所
's3a://test-bucket/test/path'
tblproperties(
"skip.header.line.count"="1" -- 先頭1行をヘッダとして読み飛ばす
)
;
AVRO, PARQUET, ORC の場合
AVROの場合
-- Hive外部テーブルの作成
CREATE EXTERNAL TABLE test_table
(
-- このスキーマ定義は、LOCATION句で指定したファイルのスキーマの名称と合わせる
-- スキーマの中から一部の項目だけをテーブルに切り出したい場合は、その切り出したい項目だけを定義する
actor_id int,
first_name string,
last_name string,
last_update string
)
STORED AS AVRO
LOCATION -- ファイルの保存場所
's3a://test-bucket/test/path'
;
ORC や Parquet の場合は、AVRO の 場合の STORED AS を ORCや PARQUET に変えるだけでいける。
PARQUET で、スキーマを手で定義しない場合
上記のように、スキーマをいちいち手で定義したくない場合、かつPARQUET が持っている全項目をとりあえずテーブルに入れられればいいよ! という場合は、以下の方法あり。
PARQUETの場合
-- Hive外部テーブルの作成
CREATE EXTERNAL TABLE test_table
-- このファイルに定義しているスキーマを使ってテーブルを作ってね! という指定
-- LOCATION句とは別のパスでも問題ない
LIKE PARQUET 's3a://test-bucket/test/path/ファイル名'
STORED AS PARQUET
LOCATION -- ファイルの保存場所(テーブルの中身として入れるファイル)
's3a://test-bucket/test/path'
;