【问题标题】:Creating sql table and reading values inside json array创建sql表并读取json数组中的值
【发布时间】:2019-12-13 09:26:42
【问题描述】:

我编写了一个查询,它根据 json 文件生成表。 json 文件有一个子部分是 json 数组,我似乎无法让我的表从 json 数组中获取值。

这是我尝试从以下位置创建表的 json 示例:

{"student": "1", "ai": [{"grade": "a", "term": 1}, {"grade": "b", "term": 2}], "year": "2017"}

表:

CREATE EXTERNAL TABLE student(
  student string COMMENT 'from deserializer', 
  grade string COMMENT 'from deserializer', 
  term string COMMENT 'from deserializer', 
  year string COMMENT 'from deserializer')
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
LOCATION 'students.json'

我也尝试过ai.grade,但这没有帮助。

我得到的当前输出是: 学生年级学期 1 2017 1 2017

我想要的是:

student      grade      term      year
1            a          1         2017
1            b          2         2017

请参阅picture,因为上面的结构可能没有显示。

【问题讨论】:

  • 您是否尝试将ai 列映射到一行“成绩”和“学期”的数组?在 Hive 语法中,它类似于 Array<struct<grade:string,term:string>>
  • 没有试过这个,它似乎可以工作,但它不会像我想要的那样单独输出结果,而是像[{grade=a, term=1}, {grade=b, term=2}]一样显示它们

标签: sql arrays json database presto


【解决方案1】:

您应该能够使用此 Hive 语法创建表:

CREATE EXTERNAL TABLE student(
  student string COMMENT 'from deserializer', 
  ai array<struct<grade:string,tinyint>> COMMENT 'from deserializer', 
  year tinyint COMMENT 'from deserializer')
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
LOCATION 'students.json'

获得表后,您可以使用以下 Presto 查询,它将数组的UNNEST 放入列中。请注意,示例查询中的 WITH 子句仅用于模拟上面的 student 表,一旦创建了 student 表,就应该将其删除。

WITH student AS (
    SELECT
        1 AS student,
        CAST(ARRAY[ROW('a', 1), ROW('b', 2)] AS ARRAY(ROW(grade VARCHAR, term TINYINT))) AS ai,
        2017 AS year
)
SELECT student, grade, term, year 
FROM student 
  CROSS JOIN UNNEST(ai)
 student | grade | term | year 
---------+-------+------+------
       1 | a     |    1 | 2017 
       1 | b     |    2 | 2017 
(2 rows)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多