【问题标题】:JSON SerDe in Hive/Athena: turning one JSON object into multiple rows?Hive/Athena 中的 JSON SerDe:将一个 JSON 对象变成多行?
【发布时间】:2020-06-30 06:57:46
【问题描述】:

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

我的 JSON 文件具有这种格式(为了方便而进行了漂亮的打印):

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

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

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

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

【问题讨论】:

    标签: json hive rows amazon-athena


    【解决方案1】:

    您无法让 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
    

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      相关资源
      最近更新 更多