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
我正在考虑使用 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