[Amazon Athena] レコードの読み取りと書き込みを異なるJSON SerDeのテーブル間でできるのか試してみた

結論:できました
2022.08.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、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 SERDEorg.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 SERDEorg.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の両者でデータの互換性はちゃんとあるようです。

以上