我在雅典娜创建了一个具有以下结构的表
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"
此外,我会先检查这些链接,然后再将此问题发布到StackOverflow和AWS Athena doc
上Can't read json file via Amazon Athena
AWS Athena json_extract query from string field returns empty values
任何评论或建议将不胜感激。
答案 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将能够获取所有行。