amazon athena-嵌套json问题

ioekq8ef  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(309)

对于一个人参加会议,我有以下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”之间的差异提供任何建议或参考资料。

2vuwiymt

2vuwiymt1#

首先,外部表中的字段与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');

当您试图访问其他字段时,您已将公司名称和linkedin公司id作为您参加的会议的字段。
之后,您可以通过以下方式访问字段:

SELECT conferences_attended
FROM attendees;

但是,由于数组是一个结构数组,因此需要使用数组索引来访问该数组特定结构的字段。所以不是这样:

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

相关问题