如何使用 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
]
,
...
]
目前只有 field1
和 field2
被推送到 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 失败记录