hive/athena中的json serde:将一个json对象转换成多行?

u91tlkcl  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(565)

我正在研究使用aws athena对大量json文件进行查询。
我的json文件有以下格式(为方便起见,预先打印):

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

“data”数组中包含的行是应该查询的。json文件的其余部分并不重要。
这可以在不修改json文件的情况下完成吗?如果是,怎么做?据我所知,serdes(或者是hive本身?)假设每行输入有一行输出,这意味着在上传到s3之前,我只能修改所有json文件(并将它们转换为jsonl?)。
(雅典娜使用hive json serde和openx json serde;afaict,没有选择写我自己的serde或文件格式…)

fwzugrvs

fwzugrvs1#

你不能让serde自动完成它,但是你可以在查询中实现你想要的。然后,可以创建一个视图来模拟数据元素已展开的表。
这样做的方法是使用 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

相关问题