Мы используем 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?