【问题标题】:Array structures querying in presto, hive在 presto、hive 中查询数组结构
【发布时间】:2018-10-23 06:18:28
【问题描述】:

col-1 有 dep_id(varchar) -

112 

col-2 有数组结构

 [
  {
    "emp_id": 8291828,
    "name": "bruce",
  },
  {
    "emp_id": 8291823,
    "name": "Rolli",
  }
]

我有一个需要展平和显示结果的用例。例如,当查询 dep_id - 112 的数据时,我需要在单独的行中显示 emp_id。 对于上述数据,查询时我的结果应如下所示

id  emp_id
112 8291828
112 8291823

获取数据的查询格式应该是什么?

【问题讨论】:

  • SELECT col1, inline(col2)?
  • 内联不起作用
  • 尝试时会发生什么?这是扩展结构数组cwiki.apache.org/confluence/display/Hive/…的唯一方法
  • 会让你回来尝试一些事情。
  • hive 中的扁平化数组 select emp_id, myq from emp_table LATERAL VIEW explode(emp_detail) q as myq flattening array presto SELECT emp_id, mya FROM emp_table CROSS JOIN UNNEST(emp_detail) AS t (myq)

标签: database hadoop hive presto


【解决方案1】:

有几个部分可以完成这项工作。首先 JSON 数据将显示为 VARCHAR,因此您首先需要在其上运行 json_parse 以将其转换为引擎中的 JSON 类型。然后您可以将JSON 类型转换为普通的SQL 结构类型,在您的情况下,这是一个行数组(see cast from JSON)。最后,您对行数组(实际上是一个嵌套表)进行交叉连接。此查询填充为您提供所需的结果

WITH your_table AS (
    SELECT
        112 AS dep_id
        , '[{"emp_id": 8291828, "name": "bruce"}, {"emp_id": 8291823, "name": "Rolli"}]' AS data
)
SELECT
    dep_id
    , r.emp_id
    , r.name
FROM your_table
CROSS JOIN
    UNNEST(cast(json_parse(data) as array(row (emp_id bigint, name varchar)))) nested_data(r)    

【讨论】:

    猜你喜欢
    • 2019-08-06
    • 2020-08-15
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2018-10-12
    • 2018-01-03
    • 2020-12-04
    相关资源
    最近更新 更多