[英]Amazon Athena - Nested JSON issues
我有以下json对象供某人参加会议:
{"conferences_attended": [
{"conference_name": "dreamforce",
"date": "2017",
"city": "san francisco",
"state": "ca"},
{"conference_name": "RampUp",
"date": "2016",
"city": "san francisco",
"state": "ca"},
],
"last_name" : "doe"}
我已经运行以下代码来创建表,该表指向将数据存储在s3中的位置
CREATE EXTERNAL TABLE IF NOT EXISTS my_db.attendees (
`last_name` string,
`conferences_attended` array< struct<
conference_name:string,
date:string,
city:string,
state:string,
>>,
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
) LOCATION 's3://**'
TBLPROPERTIES ('has_encrypted_data'='false');
现在,我的问题分为两部分。
1)如何查询以访问嵌套的json对象中的数据? 下面的两个查询不起作用,也没有很多类似的查询。
SELECT conferences_attended
FROM attendees;
SELECT conferences_attended.conference_name
FROM attendees;
2)如何查询以获取仅与嵌套json的特定部分匹配的结果?
SELECT *
FROM attendees
WHERE conferences_attended.conference_name like '%force%';
我遇到错误,使我相信我需要更改数据类型或取消嵌套数据或类似操作……感谢您的帮助以及指向支持这些类型操作的信息的链接。 请注意,我已阅读以下链接,发现它们很有帮助,但仍不能满足我的需求。 http://docs.aws.amazon.com/athena/latest/ug/rows-and-structs.html和http://thornydev.blogspot.com/2013/07/querying-json-records-via-hive。 html和许多其他...
最后,欢迎提供有关org.apache.hive.hcatalog.data.JsonSerDe和org.openx.data.jsonserde.JsonSerDe之间的区别的任何建议或资源。
首先,外部表中的字段与您要指向的json文件中的字段不匹配。
看起来,您的表定义应如下所示:
CREATE EXTERNAL TABLE IF NOT EXISTS my_db.attendees (
`last_name` string,
`conferences_attended` array<struct<conference_name:string,
date:string, city:string, state:string>>,
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
) LOCATION 's3://**'
TBLPROPERTIES ('has_encrypted_data'='false');
在尝试访问其他字段时,您已经提到company_name和linkedin_company_id作为Conferences_attended的字段。
之后,您可以通过以下方式访问字段:
SELECT conferences_attended
FROM attendees;
但是,由于conferences_attended是结构数组,因此您需要提及数组索引才能访问该特定数组结构的字段。 所以代替这个:
SELECT conferences_attended.conference_name
FROM attendees;
尝试这样的事情:
SELECT conferences_attended[1].conference_name FROM attendees;
现在,如果要解析数组中的所有结构并对数据应用一些过滤器,则可以通过以下方式使用UNNEST函数进行操作:
SELECT
last_name,
conferences.conference_name,
conferences.date,
conferences.city,
conferences.state
FROM
attendees CROSS JOIN UNNEST(conferences_attended) as t(conferences)
WHERE
conferences.conference_name like '%force%';
您可以参考以下链接以获取更多参考: http : //docs.aws.amazon.com/athena/latest/ug/flattening-arrays.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.