能否使用AWS Athena查询美化打印格式的多行JSON文件?
Athena处理美化打印(多行)JSON的解决方案
报错原因
你当前使用的org.openx.data.jsonserde.JsonSerDe默认采用按行解析逻辑,要求每个JSON对象单独占一行(即NDJSON/JSON Lines格式)。美化后的单JSON对象跨越多行时,该SerDe会将每一行视为独立JSON对象解析,仅读到第一行的{就会抛出缺少结尾}的异常,这是该SerDe的默认配置限制,并非Athena本身不支持多行JSON。
可行配置方案
不需要修改源文件,仅需调整建表语句的SerDe配置即可,以下是两种可直接使用的方案:
方案1:使用Hive JsonSerDe开启多行支持
直接替换原有建表语句的ROW FORMAT部分,新增多行配置:
CREATE EXTERNAL TABLE `sales` ( `id` STRING, `customer` STRUCT< `id`:STRING, `given_name`:STRING, `middle_initial`:STRING, `family_name`:STRING>) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH SERDEPROPERTIES ( "multiline" = "true", "ignore.malformed.json" = "true" -- 可选,遇到格式错误的文件时自动跳过,避免查询失败 ) LOCATION 's3://my-bucket/my-folder/'
方案2:Athena v2/v3 原生简化配置
如果你使用的是Athena 2.0及以上版本,可以用更简洁的原生配置:
CREATE EXTERNAL TABLE `sales` ( `id` STRING, `customer` STRUCT< `id`:STRING, `given_name`:STRING, `middle_initial`:STRING, `family_name`:STRING>) STORED AS JSON LOCATION 's3://my-bucket/my-folder/' TBLPROPERTIES ( "json.multiLine" = "true", "json.ignoreMalformed" = "true" -- 可选,跳过格式错误的文件 )
注意事项
- 上述两种方案均要求单个文件内仅包含一个JSON对象,和你当前的文件格式完全匹配,无需调整源文件生成逻辑。
- 配置生效后,查询用法和单行JSON的表完全一致,无需额外修改查询语句。
内容的提问来源于stack exchange,提问作者Gabriel C
相关产品推荐
相关产品推荐

