JSON SerDe を使用して、印刷用に整形された形式の (pretty-print の) JSON ファイルで Amazon Athena クエリを実行すると、クエリが失敗し、以下のエラーメッセージが表示されます。 「HIVE_CURSOR_ERROR: 行が有効な JSON オブジェクトではありません。」
解決策
Athena JSON SerDe は、以下のファイルのような印刷用に整形された形式の (pretty-print の) JSON ファイルをサポートしていません。
{
"id": "b179db57-9d5b-40c8-8f07-f75bd1fa1b3c",
"random_number": 19,
"categories": [
"category 1",
"category 2"
],
"dict": {
"name": "category 1",
"comment": "category 2"
}
}
{
"id": "bc4624ce-d752-4e38-8a30-42de158dbc50",
"random_number": 95,
"categories": [
"category 1",
"category 2",
"category 3",
"category 4"
],
"dict": {
"name": "category 2",
"comment": "category 1"
}
}
{
"id": "1d3298e8-e3bb-41c0-950c-6a146555ce3c",
"random_number": 89,
"categories": [
"category 1"
],
"dict": {
"name": "category 5",
"comment": "category 3"
}
}
Amazon Ion は JSON のスーパーセットであるため、Amazon Ion Hive SerDe を使って Amazon Ion 以外の JSON データセットをクエリします。Amazon Ion SerDe では、他の JSON SerDe ライブラリとは異なり、データの各行が 1 行内にあることを想定されていません。この機能を使用することで、印刷用に整形された形式の (pretty-print の) JSON データセットをクエリしたり、行のフィールドを改行文字で分割したりできます。
1. Athena Ion Hive SerDe を使用して以下のようなテーブルを作成します。
CREATE EXTERNAL TABLE table_name (
id string,
random_number int,
categories array<string>,
dict struct<name:string, comment:string>
)
STORED AS ION
LOCATION 's3://sample-bucket/prefix/'
2. テーブルをクエリします。
SELECT * FROM table_name
出力は、以下のような出力になります:
# id random_number categories dict
1 b179db57-9d5b-40c8-8f07-f75bd1fa1b3c 19 [category 1, category 2] {name=category 1, comment=category 2}
2 bc4624ce-d752-4e38-8a30-42de158dbc50 95 [category 1, category 2, category 3, category 4] {name=category 2, comment=category 1}
3 1d3298e8-e3bb-41c0-950c-6a146555ce3c 89 [category 1] {name=category 5, comment=category 3}
関連情報
JSON データを Amazon Athena 内で 読み取ろうとするとエラーが発生します。なぜですか?