JSON Hive/Athena 中的 SerDe:将一个 JSON 对象变成多行?

JSON SerDe in Hive/Athena: turning one JSON object into multiple rows?

我正在考虑使用 AWS Athena 对大量 JSON 文件进行查询。

我的 JSON 文件采用这种格式(为方便起见进行了精美打印):

{
 "data":[
         {<ROW1>},
         {<ROW2>},
          ...
        ],
 "foo":[...],
 "bar":[...]
}

“数据”数组中包含的行是应该查询的内容。 JSON 文件的其余部分并不重要。

是否可以在不修改 JSON 文件的情况下完成此操作? 如果可以,怎么做?从我能够找到的内容来看,SerDes(或者它是 Hive 本身吗?)假设每行输入一行输出,这意味着我不得不修改我所有的 JSON 文件(并将它们变成 JSONL?),然后再将它们上传到 S3。

(Athena 使用 Hive JSON SerDe 和 OpenX JSON SerDe;AFAICT,没有选项可以编写我自己的 SerDe 或文件格式...)

你不能让 serde 自动执行它,但你可以在查询中实现你想要的。然后,您可以创建一个视图来模拟 table 数据元素展开。

执行此操作的方法是使用 UNNEST 关键字。这会为数组中的每个元素生成一个新行:

SELECT
  foo,
  bar,
  element
FROM my_table, UNNEST(data) AS t(element)

如果您的 JSON 看起来像这样:

{"foo": "f1", "bar": "b1", "data": [1, 2, 3]}
{"foo": "f2", "bar": "b2", "data": [4, 5]}

查询结果如下所示:

foo | bar | element
----+-----+--------
f1  | b1  | 1
f1  | b1  | 2
f1  | b1  | 3
f2  | b2  | 4
f2  | b2  | 5