繁体   English   中英

Amazon Athena-嵌套JSON问题

[英]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.htmlhttp://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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM