使用Kinesis Data Firehose转换JSON到Parquet为何生成None列?
问题:Kinesis Data Firehose转Parquet后payload列全为None
转换生成的Parquet文件数据:
payload 0 None 1 None 2 None
从转换Lambda传入Firehose的JSON数据:
{ "mainid": { "id1": "org-sam-test-2-glue-schema-org", "id2": "9dbcf7d824b821e968983e2f040918d64f75bd331ff8442265c56c13cc6d8be8", "id3": "f8676ed6-188a-488b-aff2-32b1d51cec51", "id4": "36fd2a6e-81e1-4516-810f-74e8adbb8ba1", "id5": "b30a3bf1-999f-4a07-b15b-c7cc29d33df9", "id6": "9dbcf7d824b821e968983e2f040918d64f75bd331ff8442265c56c13cc6d8be8" } }
Glue表结构:
struct<mainid:struct<id1:string,id2:string,id3:string,id4:string,id5:string,id6:string>>
Firehose配置说明:已启用Apache Parquet格式转换,关联目标Glue表,配置了基于Glue表的模式转换。
解决方案
1. 修正Lambda输出的JSON格式与结构
首先,原Lambda输出的JSON存在格式问题(键名未加双引号),这会导致Firehose无法解析,必须先修正为标准JSON格式。
其次,Firehose默认会将顶层JSON对象映射为payload列,但当前Glue表结构的顶层是mainid,层级不匹配。需要将Lambda输出的数据包裹在payload字段中:
{ "payload": { "mainid": { "id1": "org-sam-test-2-glue-schema-org", "id2": "9dbcf7d824b821e968983e2f040918d64f75bd331ff8442265c56c13cc6d8be8", "id3": "f8676ed6-188a-488b-aff2-32b1d51cec51", "id4": "36fd2a6e-81e1-4516-810f-74e8adbb8ba1", "id5": "b30a3bf1-999f-4a07-b15b-c7cc29d33df9", "id6": "9dbcf7d824b821e968983e2f040918d64f75bd331ff8442265c56c13cc6d8be8" } } }
2. 调整Glue表结构匹配输入层级
如果不想修改Lambda输出,可直接调整Glue表结构,让顶层字段对应Firehose默认的payload:
struct<payload:struct<mainid:struct<id1:string,id2:string,id3:string,id4:string,id5:string,id6:string>>>
3. 检查Firehose转换配置细节
- 确认「Record format conversion」已设置为
Apache Parquet - 确认关联的Glue表结构与输入数据的层级完全对应
- 若未使用动态分区,关闭「Enable dynamic partitioning」避免映射错误
- 确保Firehose的「Input format」设置为
JSON,且未配置额外的字段过滤规则
内容的提问来源于stack exchange,提问作者Sam Comber
相关产品推荐
相关产品推荐

