如何将嵌套的 Avro 字段作为单个字段复制到 Redshift?
Posted
技术标签:
【中文标题】如何将嵌套的 Avro 字段作为单个字段复制到 Redshift?【英文标题】:How do I COPY a nested Avro field to Redshift as a single field? 【发布时间】:2018-09-24 17:37:04 【问题描述】:我有以下 Avro 架构作为记录,我想向 Redshift 发出一份副本:
"fields": [
"name": "id",
"type": "long"
,
"name": "date",
"type":
"type": "record",
"name": "MyDateTime",
"namespace": "com.mynamespace",
"fields": [
"name": "year",
"type": "int"
,
"name": "monthOfYear",
"type": "int"
,
"name": "dayOfMonth",
"type": "int"
,
"name": "hourOfDay",
"type": "int"
,
"name": "minuteOfHour",
"type": "int"
,
"name": "secondOfMinute",
"type": "int"
,
"name": "millisOfSecond",
"type": ["int", "null"],
"default": 0
,
"name": "zone",
"type":
"type": "string",
"avro.java.string": "String"
,
"default": "America/New_York"
],
"noregistry": []
]
我想在 COPY 期间将 MyDateTime
中的对象压缩为 Redshift 中的单个列。我看到您可以将嵌套的 JSON 数据映射到***列:https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-format.html#copy-json-jsonpaths,但我还没有找到直接在 COPY 命令中连接字段的方法。
也就是说,有没有办法转换下面的记录(原来是Avro格式)
"id": 6,
"date":
"year": 2010,
"monthOfYear": 10,
"dayOfMonth": 12,
"hourOfDay": 14,
"minuteOfHour": 26,
"secondOfMinute": 42,
"millisOfSecond":
"int": 0
,
"zone": "America/New_York"
在 Redshift 中放入一行,如下所示:
id | date
---------------------------------------------
6 | 2010-10-12 14:26:42:000 America/New_York
我想直接用 COPY 来做这个
【问题讨论】:
【参考方案1】:您需要将 Avro 文件声明为 Redshift Spectrum 外部表,然后对其使用查询将数据插入到本地 Redshift 表中。
https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_TABLE.html
【讨论】:
以上是关于如何将嵌套的 Avro 字段作为单个字段复制到 Redshift?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Avro 生成 String 类型的字段而不是 CharSequence?
使用 Databricks 将十进制字段加载到 Redshift 表时出现 Avro 文件错误
GenericRecord 的 Avro 架构:能够保留空白字段