如何使用 AWS Firehose 将时间戳数据插入 AWS Glue 托管的 Iceberg 表中?

问题描述 投票:0回答:1

使用 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类型的时间戳。

胶水

  • 我的桌子是冰山型的。
  • 我没有定义任何额外的 SerDe 库或 SerDe 参数。
  • 表架构是:
    • 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
    ,并且写入的数据不清晰。
  • 切换到 TimestampType.WithZone 会导致相同的错误。
  • 尝试像
    org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
    timestamp.formats
    参数这样的 SerDe 库没有帮助。 Glue 创建了表的新版本并完全删除了 SerDe 参数。

我即将放弃,只是将时间戳写为字符串。任何见解表示赞赏!

python amazon-web-services aws-glue amazon-kinesis-firehose apache-iceberg
1个回答
0
投票

您发送到 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 列以允许接受毫秒。

© www.soinside.com 2019 - 2024. All rights reserved.