(原文)
Impalaのファイルフォーマット
最適なファイルフォーマットを使用することは、優れたパフォーマンスを得るためには極めて重要です。これは、Impala アプリケーション(英語)でJSONがサポートされていない理由の一つです。実際に、1レコードでさえ全てのテキストレコードの構文解析や取得をすることは、パフォーマンスにひどいダメージを与えます。Impalaでは別の一連のフォーマットを推奨しています。
ここではjsonデータを含んだAvroフォーマットのHiveテーブルと、新しいParquetフォーマットのテーブルをどのようにして作成するのかを紹介しています。HadoopチュートリアルシリーズのEpisode 2 of the Season 2 (英語)の同じYelpデータを使用しています。
Avro
最初の手順はPigスクリプトの支援によりデータをJSONに変換することです。Pig Editor をオープンして実行します:
REGISTER piggybank.jar
data = load '/user/hive/warehouse/review/yelp_academic_dataset_review_clean.json'
AS (funny:INT, useful:INT, cool:INT, user_id:CHARARRAY, review_id:CHARARRAY, text:CHARARRAY, business_id:CHARARRAY, stars:INT, date:CHARARRAY, type:CHARARRAY);
data_clean = FILTER data BY business_id IS NOT NULL AND text IS NOT NULL;
STORE data_clean INTO 'impala/reviews_avro'
USING org.apache.pig.piggybank.storage.avro.AvroStorage(
'{
"schema": {
"name": "review",
"type": "record",
"fields": [
{"name":"funny", "type":"int"},
{"name":"useful", "type":"int"},
{"name":"cool", "type":"int"},
{"name":"user_id", "type":"string"}
{"name":"review_id", "type":"string"},
{"name":"text", "type":"string"},
{"name":"business_id", "type":"string"},
{"name":"stars", "type":"int"},
{"name":"date", "type":"string"},
{"name":"type", "type":"string"},
]}
}');
続いて、Hive Editorで、以下のようにしてテーブルを作成します:
CREATE TABLE review_avro
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS
inputformat 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
outputformat 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
LOCATION '/user/romain/impala/reviews_avro'
tblproperties ('avro.schema.literal'='{
"name": "review",
"type": "record",
"fields": [
{"name":"business_id", "type":"string"},
{"name":"cool", "type":"int"},
{"name":"date", "type":"string"},
{"name":"funny", "type":"int"},
{"name":"review_id", "type":"string"},
{"name":"stars", "type":"int"},
{"name":"text", "type":"string"},
{"name":"type", "type":"string"},
{"name":"useful", "type":"int"},
{"name":"user_id", "type":"string"}]}'
);
ここでImpalaに戻り、以下のようにメタデータをリフレッシュした後にテーブルを使用することができます:
REFRESH avro_table
Parquet
Parquetは、新しい列指向のバイナリーファイルフォーマットで、特にImpalaには効率が良いです。これはImpalaアプリからテーブルを作成する方法です:
CREATE TABLE review_parquet LIKE review STORED AS PARQUETFILE;
その後データをロードします:
INSERT OVERWRITE review_parquet SELECT * FROM review;
時間をかけて、それぞれのフォーマットの目的についてと、圧縮を有効にする方法を読んでみて下さい。より詳しく知りたければ、Impala tuning guideも良い参考資料です。