Amazon athena无法读取S3 JSON对象文件,并且Athena select查询返回JSON键列的空结果集

时间:2018-10-06 19:02:47

标签: json amazon-web-services amazon-athena presto

我在雅典娜创建了一个具有以下结构的表

CREATE EXTERNAL TABLE s3_json_objects (
    devId string,
    type string,
    status string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://mybucket/folder1/data/athena_test/';
  

S3存储桶对象包含这样的JSON结构

{
    "devId": "00abcdef1122334401",
    "type": "lora",
    "status": "huihuhukiyg"
}

但是下面的SQL可以正常工作,并且仅对 count

个返回正确的结果
SELECT count(*) as total_s3_objects FROM "athena_db"."s3_json_objects"
  

但是只要我在下面的SQL select语句中查询以获取   来自S3的JSON值,它返回带有空值的列的结果集

SELECT devid FROM "athena_db"."s3_json_objects"
SELECT json_extract(devid , '$.devid') as Id FROM "athena_db"."s3_json_objects"
SELECT * FROM "athena_db"."s3_json_objects"
     

enter image description here

此外,我会先检查这些链接,然后再将此问题发布到StackOverflow和AWS Athena doc

Can't read json file via Amazon Athena

AWS Athena json_extract query from string field returns empty values

任何评论或建议将不胜感激。

3 个答案:

答案 0 :(得分:1)

JSON必须在一行中,如this page of the AWS Athena documentation中所述。您可以在单独的行上包含多个JSON对象,但是每个完整的对象只能跨一行。

示例(这些都可能在一个S3对象中):

{"devId": "a1", "type": "b1", "status": "c1"}
{"devId": "a2", "type": "b2", "status": "c2"}

答案 1 :(得分:1)

Glue可以读取多行json对象,因为它在引擎盖下具有火花引擎。一种解决方法是,如果您无法轻松地使这些json对象在线,则使用胶水将这些json对象转换为实木复合地板。

答案 2 :(得分:0)

使用jsonlines将JSON转换为jsonlines,然后Athena将能够获取所有行。