我们使用awsdms将sqlserverdbs作为Parquet文件转储到s3中。我们的想法是用spark over parquets进行一些分析。当一个完整的负载是完整的,那么它是不可能阅读Parquet,因为他们有 UINT
架构中的字段。斯帕克拒绝和我一起读 Parquet type not supported: INT32 (UINT_8)
. 我们使用转换规则覆盖数据类型 UINT
柱。但看起来它们并没有被dms引擎接收到。为什么?
有许多规则,如“convert unit to int”(请注意uint1是1字节无符号dms数据类型):
{
"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引擎版本是 3.3.2
然而,仍然得到Parquet图案与uint。见下表:
id: int32
name: string
value: string
status: uint8
尝试阅读这样的Parquet用Spark给我
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条答案
按热度按时间nxagd54h1#
将数据直接从uint转换为dms上的int可以解决这个问题。Map规则应如下所示:
文档:https://docs.aws.amazon.com/dms/latest/userguide/chap_tasks.customizingtasks.tablemapping.html#chap_tasks.customizingtasks.tablemapping.selectiontransformation.transformations
1u4esq0p2#
唯一能让转换在Parquet文件上工作的方法是指定要转换的确切列。例如:
在对象定位器中使用通配符%作为列名是行不通的