[Amazon Athena] レコードの読み取りと書き込みを異なるJSON SerDeのテーブル間でできるのか試してみた
こんにちは、CX事業本部 IoT事業部の若槻です。
Amazon Athenaでは、JSON SerDe librariesとして次の2つをサポートしています。
Hive JSON SerDeはJSONデータを処理する際に一般的に使われるSerDeです。レコードの読み取り(SELECT)だけでなく書き込み(INSERT INTO)クエリにも対応しています。一方でOpenX JSON SerDeが対応しているのは読み取りのみですが、ignore.malformed.json
などの便利なオプションプロパティが利用可能です。
つまり、レコードの書き込みはHive JSON SerDe、読み取りはOpenX JSON SerDeと使い分けられると便利そうです。
そこで今回は、同じデータに対して読み取りをHive JSON SerDe、書き込みをOpenX JSON SerDeと異なるJSON SerDeのテーブル間で出来るのか試してみました。
やってみた
テーブルの作成
外部テーブルをデータカタログに作成します。
Hive JSON SerDeのテーブルです。ROW FORMAT SERDE
でorg.apache.hive.hcatalog.data.JsonSerDe
を指定します。
CREATE EXTERNAL TABLE counts_hive( id string, count int ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://cm-test-220802/counts' TBLPROPERTIES ('has_encrypted_data'='false')
OpenX JSON SerDeのテーブルです。ROW FORMAT SERDE
でorg.openx.data.jsonserde.JsonSerDe
を指定します。またプロパティとして"ignore.malformed.json" = "TRUE"
を指定し、不正なレコードを無視出来るようにします。
CREATE EXTERNAL TABLE counts_openx( id string, count int ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("ignore.malformed.json" = "TRUE") STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://cm-test-220802/counts' TBLPROPERTIES ('has_encrypted_data'='false')
レコードの書き込み、読み取り
まずHive JSON SerDeのテーブルを使用してレコードを書き込みます。
INSERT INTO counts_hive (id, count) VALUES ('u001', 100), ('u002', 50), ('u001', 200)
次にOpenX JSON SerDeのテーブルを使用してレコードを読み取ります。
SELECT * FROM counts_openx
するとレコードが問題なく読み取れました!
おわりに
同じデータに対して読み取りをHive JSON SerDe、書き込みをOpenX JSON SerDeと異なるJSON SerDeのテーブル間で出来るのか試してみました。
検証の結果、「できる」という結論となりました。HiveとOpenXの両者でデータの互換性はちゃんとあるようです。
以上