【问题标题】:How to use AWS Kinesis Firehose to push nested structure to Redshift如何使用 AWS Kinesis Firehose 将嵌套结构推送到 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 行。

【问题讨论】:

    标签: amazon-web-services amazon-redshift firehose


    【解决方案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"
        ]
    }
    

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

    【讨论】:

      猜你喜欢
      • 2016-11-13
      • 2016-04-01
      • 2021-07-16
      • 2017-07-20
      • 2021-09-27
      • 2018-06-02
      • 2016-03-16
      • 2017-08-10
      相关资源
      最近更新 更多