使用 AWS Firehose 将数据提取到由 AWS Glue 管理的 Iceberg 表中,我无法插入时间戳数据。
消防水带
我正在尝试使用以下脚本插入数据:
json_data = json.dumps(
{
"ADF_Record": {
"foo": "bar",
"baz": "2024-09-04T18:56:15.114"
},
"ADF_Metadata": {
"OTF_Metadata": {
"DestinationDatabaseName": "my_db",
"DestinationTableName": "my_table",
"Operation": "INSERT"
}
}
}
)
response = boto3.client("firehose").put_record(
DeliveryStreamName="my_stream",
Record={"Data": json_data.encode()}
)
请注意,
baz
值对应于Firehose文档中引用的TimestampType.withoutZone类型的时间戳。
胶水
foo
:string
baz
:timestamp
错误
每当我尝试使用此方法插入数据时,都不会传递任何数据,并且我在 Firehose 端收到此错误:
Firehose is unable to convert column data in your record to the column type specified within the schema. Table: my_db.my_table
我尝试过的事情
baz
时,数据被写入(管道似乎在没有时间戳的情况下正常工作)。1725476175114000
) 没有帮助。 Glue 创建了一个新版本的表格,其中 baz
为 date
,并且写入的数据不清晰。org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
和 timestamp.formats
参数这样的 SerDe 库没有帮助。 Glue 创建了表的新版本并完全删除了 SerDe 参数。我即将放弃,只是将时间戳写为字符串。任何见解表示赞赏!
您发送到 AWS Firehose 的日期格式似乎有问题。 您发送带有
T
的日期,时间:2024-09-04T18:56:15.114
。但是,据我所知,它等待日期格式没有T
,所以尝试更改它:
json_data = json.dumps(
{
"ADF_Record": {
"foo": "bar",
"baz": "2024-09-04 18:56:15.114"
},
...
)
如果这对您没有帮助,请尝试删除毫秒。如果删除毫秒会有帮助,您将需要在 Glue 表架构中正确配置 baz 列以允许接受毫秒。