Как скопировать вложенное поле Avro в Redshift как одно поле? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть следующая схема Avro для записи, и я хотел бы выдать COPY для 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": []
    }
}]

Я хочу сжать объект в MyDateTime во время COPY до одногоколонка в 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 Ответ

0 голосов
/ 03 октября 2018

Вам необходимо объявить Avro-файл (ы) как внешнюю таблицу Redshift Spectrum, а затем использовать запрос, чтобы вставить данные в локальную таблицу Redshift.

https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_TABLE.html

...