You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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表中明确指定格式)

3. 配置Glue表的SerDe参数

如果使用本地时间格式,需要在Glue表中添加SerDe属性,明确时间解析规则:

  1. 进入AWS Glue控制台,找到目标表
  2. 编辑表属性,添加以下键值对:
    • 键: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:22:07