创建sql表并读取json数组中的值
Posted
技术标签:
【中文标题】创建sql表并读取json数组中的值【英文标题】:Creating sql table and reading values inside json array 【发布时间】: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]
一样显示它们
【参考方案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)
【讨论】:
以上是关于创建sql表并读取json数组中的值的主要内容,如果未能解决你的问题,请参考以下文章