如何将嵌套的 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?的主要内容,如果未能解决你的问题,请参考以下文章

从 HIVE 表加载到 HDFS 作为 AVRO 文件

如何使用 Avro 生成 String 类型的字段而不是 CharSequence?

使用 Databricks 将十进制字段加载到 Redshift 表时出现 Avro 文件错误

GenericRecord 的 Avro 架构:能够保留空白字段

当涉及两个以上的表时,如何将来自相似字段的单个表的两个左连接转换为 LINQ? [复制]

如何在 MySQL 中使用自动增量字段复制行并插入到同一个表中?