如何使用 AWS Kinesis Firehose 将嵌套结构推送到 Redshift

Posted

技术标签:

【中文标题】如何使用 AWS Kinesis Firehose 将嵌套结构推送到 Redshift【英文标题】:How to use AWS Kinesis Firehose to push nested structure to Redshift 【发布时间】:2021-04-29 13:24:59 【问题描述】:

我们正在使用 Kinesis Firehose 将数据推送到 s3 和 Redshift。 我们将整个对象推送到 s3 中,并且仅将一部分字段推送到红移。

这是我们当前推送到 Firehose 的对象示例。

[
  
    field1: 1,
    field2: 1,
    arr: [
      inner_field1: 1, inner_field2: 1, 
      inner_field1: 1, inner_field2: 1
    ]
,
...
]

目前只有 field1field2 被推送到 redshift,但我们也希望将 arr 字段推送到 Redshift。

我们想到的第一个选项是使用新的 SUPER 类型,但我没有找到任何关于如何将 SUPER 类型对象从 firehose 推送到 redshift 的文档。

第二个选项(在我们的例子中是首选)是在推入 Redshift 之前展平结构。

因此,使用上面的示例对象,我们希望看到一个包含 4 列 field1、field2、inner_field1、inner_field2 的表,而我们的示例对象将产生 2 行。

【问题讨论】:

【参考方案1】:

假设你的表格格式是:

CREATE TABLE super_test (
    field1 INTEGER,
    field2 INTEGER,
    arr SUPER
);

当使用此页面中的 json_paths 时,我最终通过“将 JSON 文档复制到多个 SUPER 数据列”解决方案中获得了成功: https://docs.aws.amazon.com/redshift/latest/dg/ingest-super.html

在我的例子中,我有一个 JSON 子对象而不是一个“arr”数组元素,但我认为解决方案是相同的,因为两者都是有效的 JSON 构造。

我在 Kinesis Firehose 中的复制选项类似于:

format as json 's3://<bucket-name>/schema/kinesis-schema.json'

AWS 示例在上面的format as json 中没有as。不清楚是否需要 as。我知道它在那里对我有用。

这是 Firehose 报告的完整 COPY 声明:

COPY super_test FROM 's3://<bucket-name>/<manifest>' CREDENTIALS 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' MANIFEST format as json 's3://<bucket-name>/schema/kinesis-schema.json';

根据您的字段名称,kinesis-schema.json 将具有以下格式:


    "jsonpaths": [
        "$.field1",
        "$.field2",
        "$.arr"
    ]

这至少对我有用。希望这至少可以帮助您找到正确的方向。

【讨论】:

以上是关于如何使用 AWS Kinesis Firehose 将嵌套结构推送到 Redshift的主要内容,如果未能解决你的问题,请参考以下文章

AWS Kinesis Firehose 到 ElasticSearch 地理数据映射

AWS Typescript CDK,尝试将 kinesis 流作为来源添加到 firehose

将镶木地板从 AWS Kinesis firehose 写入 AWS S3

将 AWS Kinesis Firehose 回填到 Elasticsearch Service 失败记录

从 fluentd 发送到 aws kinesis firehose 时数据丢失

任何人在使用 AWS kinesis 流、lambda 和 firehose 时都遇到过数据丢失的情况?