Kinesis Firehose转Parquet缺失timestamp列,求正确时间格式
问题
使用Kinesis Firehose将IoT Core传来的JSON数据写入S3,已启用格式转换功能将JSON载荷转为Parquet格式,对应的AWS Glue表结构如下:
temperature: float humidity: float project: string timestamp: timestamp
JSON载荷示例(原始存在语法错误):
{ "temperature": 20 "humidity": 60 "project": project "timestamp": 2023-02-17 16:15:16.486570 }
转换流程正常,S3中生成了Parquet文件,但timestamp列缺失。尝试过多种时间格式,要么转换报错,要么仍无timestamp列。请问遗漏了什么?timestamp应使用什么格式?
解决方案
1. 修复JSON语法错误
原始JSON存在3个致命语法问题,会导致Firehose无法正确解析字段:
- 所有键值对末尾缺少逗号(
temperature:20、humidity:60、project:project后必须添加逗号) project的值未用双引号包裹,属于无效字符串timestamp的值未用双引号包裹,Firehose无法识别为字符串类型进行格式转换
修正后的合法JSON示例:
{ "temperature": 20, "humidity": 60, "project": "project", "timestamp": "2023-02-17 16:15:16.486570" }
2. 统一timestamp的格式标准
Firehose格式转换依赖AWS Glue的Parquet SerDe,对timestamp类型的输入有严格要求:
- 必须是带双引号的字符串,不能是裸的时间值
- 推荐使用两种兼容格式:
- ISO 8601标准格式(带时区):
"2023-02-17T16:15:16.486570Z" - 本地时间格式:
"2023-02-17 16:15:16.486570"(需在Glue表中明确指定格式)
- ISO 8601标准格式(带时区):
3. 配置Glue表的SerDe参数
如果使用本地时间格式,需要在Glue表中添加SerDe属性,明确时间解析规则:
- 进入AWS Glue控制台,找到目标表
- 编辑表属性,添加以下键值对:
- 键:
timestamp.formats,值:yyyy-MM-dd HH:mm:ss.SSSSSS - 键:
serialization.format,值:1
- 键:
或者通过SQL创建表时直接指定:
CREATE EXTERNAL TABLE IF NOT EXISTS iot_data ( temperature float, humidity float, project string, timestamp timestamp ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' WITH SERDEPROPERTIES ( 'timestamp.formats' = 'yyyy-MM-dd HH:mm:ss.SSSSSS' ) LOCATION 's3://your-bucket/path/' TBLPROPERTIES ('has_encrypted_data'='false');
4. 检查Firehose转换配置
- 确认Firehose格式转换中选择的Glue表包含
timestamp列,且类型为timestamp - 开启“转换失败记录保存”功能:在Firehose配置中设置将转换失败的记录保存到S3,便于排查格式不兼容问题
内容的提问来源于stack exchange,提问作者Higor Nunes
相关产品推荐
相关产品推荐

