AWS DMS SQL Сервер в паркет s3 - правило преобразования изменения типа данных и 'Тип паркета не поддерживается: INT32 (UINT_8)' - PullRequest
0 голосов
/ 26 мая 2020

Мы используем AWS DMS для сброса SQL серверных БД в S3 как паркетные файлы. Идея состоит в том, чтобы запустить некоторую аналитику с помощью искры на паркете. Когда полная загрузка завершена, читать паркет становится невозможно, так как у них в схеме есть поля UINT. Спарк отказывается их читать, набрав Parquet type not supported: INT32 (UINT_8). Мы используем правила преобразования для перезаписи типа данных UINT столбцов. Но похоже, что они не подхватываются движком DMS. Почему?

Существует ряд правил, таких как «преобразовать единицу измерения в int», см. Ниже (помните, что UINT1 - это 1 байт без знака DMS DataTypes ):

{
  "rule-type": "transformation",
  "rule-id": "7",
  "rule-name": "uintToInt",
  "rule-action": "change-data-type",
  "rule-target": "column",
  "object-locator": {
    "schema-name": "%",
    "table-name": "%",
    "column-name": "%",
    "data-type": "uint1"
  },
  "data-type": {
    "type": "int4"
  }
}

S3 DataFormat=parquet;ParquetVersion=parquet_2_0 и версия DMS Engine 3.3.2

Однако все еще получаются схемы паркета с uint. См. Ниже:

id: int32
name: string
value: string
status: uint8

Попытка прочитать такой паркет с помощью искры дает мне

org.apache.spark.sql.AnalysisException: Parquet type not supported: INT32 (UINT_8);
    at org.apache.spark.sql.execution.datasources.parquet.ParquetToSparkSchemaConverter.typeNotSupported$1(ParquetSchemaConverter.scala:100)
    at org.apache.spark.sql.execution.datasources.parquet.ParquetToSparkSchemaConverter.convertPrimitiveField(ParquetSchemaConverter.scala:136)

Почему не срабатывает правило преобразования DMS?

Ответы [ 2 ]

0 голосов
/ 28 июля 2020

Единственный способ заставить преобразование работать с файлами паркета - это указать точный столбец для преобразования. Так, например:

{
   "rules": [
   ...
   {
    "rule-type": "transformation",
    "rule-id": "2",
    "rule-name": "unit1-to-int1",
    "rule-action": "change-data-type",
    "rule-target": "column",
    "object-locator": {
        "schema-name": "acessa",
        "table-name": "<table_name>",
        "column-name": "<column_name>"
    },
    "data-type": {
        "type": "int1"
    }
   }
  ]
}

Использование подстановочного знака% для имени столбца в локаторе объектов просто не работает

0 голосов
/ 22 июня 2020

Преобразование данных напрямую из UINT в INT в DMS устраняет эту проблему. Ваши правила сопоставления должны выглядеть так:

{
"rules": [
    ...
    {
        "rule-type": "transformation",
        "rule-id": "2",
        "rule-name": "unit1-to-int1",
        "rule-action": "change-data-type",
        "rule-target": "column",
        "object-locator": {
            "schema-name": "acessa",
            "table-name": "%",
            "column-name": "%",
            "data-type": "uint1"
        },
        "data-type": {
            "type": "int1"
        }
    },
    {
        "rule-type": "transformation",
        "rule-id": "3",
        "rule-name": "unit2-to-int2",
        "rule-action": "change-data-type",
        "rule-target": "column",
        "object-locator": {
            "schema-name": "acessa",
            "table-name": "%",
            "column-name": "%",
            "data-type": "uint2"
        },
        "data-type": {
            "type": "int2"
        }
    },
    {
        "rule-type": "transformation",
        "rule-id": "4",
        "rule-name": "unit4-to-int4",
        "rule-action": "change-data-type",
        "rule-target": "column",
        "object-locator": {
            "schema-name": "acessa",
            "table-name": "%",
            "column-name": "%",
            "data-type": "uint4"
        },
        "data-type": {
            "type": "int4"
        }
    },
    {
        "rule-type": "transformation",
        "rule-id": "5",
        "rule-name": "unit8-to-int8",
        "rule-action": "change-data-type",
        "rule-target": "column",
        "object-locator": {
            "schema-name": "acessa",
            "table-name": "%",
            "column-name": "%",
            "data-type": "uint8"
        },
        "data-type": {
            "type": "int8"
        }
    }
]}

Документация: https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.html#CHAP_Tasks .CustomizingTasks.TableMapping.SelectionTransformation.Transformations

...