对于一个人参加会议,我有以下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”之间的差异提供任何建议或参考资料。
1条答案
按热度按时间2vuwiymt1#
首先,外部表中的字段与json文件中您试图指向的字段不匹配。
看起来,您的表定义应该如下所示:
当您试图访问其他字段时,您已将公司名称和linkedin公司id作为您参加的会议的字段。
之后,您可以通过以下方式访问字段:
但是,由于数组是一个结构数组,因此需要使用数组索引来访问该数组特定结构的字段。所以不是这样:
尝试以下操作:
现在,如果要解析数组中的所有结构并对数据应用一些筛选器,可以使用unnest函数按以下方式进行:
有关更多参考,请参阅以下链接:http://docs.aws.amazon.com/athena/latest/ug/flattening-arrays.html