Scala ApacheSpark:不支持的拼花地板数据类型

Scala ApacheSpark:不支持的拼花地板数据类型,scala,apache-spark,hive,cloudera,apache-spark-sql,Scala,Apache Spark,Hive,Cloudera,Apache Spark Sql,我正在尝试使用SparkSql HiveContext读取配置单元表。但是,当我提交作业时,会出现以下错误: Exception in thread "main" java.lang.RuntimeException: Unsupported parquet datatype optional fixed_len_byte_array(11) amount (DECIMAL(24,7)) at scala.sys.package$.error(package.scala:

我正在尝试使用SparkSql HiveContext读取配置单元表。但是,当我提交作业时,会出现以下错误:

Exception in thread "main" java.lang.RuntimeException: Unsupported parquet datatype optional fixed_len_byte_array(11) amount (DECIMAL(24,7))
            at scala.sys.package$.error(package.scala:27)
            at org.apache.spark.sql.parquet.ParquetTypesConverter$.toPrimitiveDataType(ParquetTypes.scala:77)
            at org.apache.spark.sql.parquet.ParquetTypesConverter$.toDataType(ParquetTypes.scala:131)
            at org.apache.spark.sql.parquet.ParquetTypesConverter$$anonfun$convertToAttributes$1.apply(ParquetTypes.scala:383)
            at org.apache.spark.sql.parquet.ParquetTypesConverter$$anonfun$convertToAttributes$1.apply(ParquetTypes.scala:380)
列类型为十进制(24,7)。我已经用HiveQL更改了列类型,但它不起作用。我还尝试在sparksql中转换为另一种十进制类型,如下所示:

val results = hiveContext.sql("SELECT cast(amount as DECIMAL(18,7)), number FROM dmp_wr.test")
但是,我也犯了同样的错误。我的代码是这样的:

def main(args: Array[String]) {
val conf: SparkConf = new SparkConf().setAppName("TColumnModify")
val sc: SparkContext = new SparkContext(conf)
val vectorAcc = sc.accumulator(new MyVector())(VectorAccumulator)
val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
val results = hiveContext.sql("SELECT amount, number FROM dmp_wr.test")
我怎样才能解决这个问题?谢谢你的回复

Edit1:我找到引发异常的火花源行。看起来是这样的

if(originalType == ParquetOriginalType.DECIMAL && decimalInfo.getPrecision <= 18)
if(originalType==ParquetOriginalType.DECIMAL&&decimalInfo.getPrecision
Hive中的Alter table命令不涉及存储在Hive中的实际数据。它只更改Hive Metastore中的元数据。这与普通数据库(如MySQL)中的“Alter table”命令有很大不同

当Spark从拼花文件读取数据时,它将尝试使用实际拼花文件中的元数据来反序列化数据,这仍然会给它提供十进制(24,7)

您的问题有两种解决方案: 1.试用一个新版本的Spark-build from trunk。看看是什么完全改变了代码的这一部分(虽然只在Spark 1.5中),希望你不会再看到同样的问题

  • 手动转换表中的数据。您可以使用配置单元查询,如“插入覆盖表新建\u表选择*来自旧\u表”)进行转换

  • 谢谢你的回复。。。我使用的是CDH5.4.3,他们只支持Spark 1.3.0。所以,我会尝试第二种选择。我也有同样的问题。在
    hiveContext
    中更改配置似乎可以做到这一点:
    hiveContext.setConf(“spark.sql.hive.convertMetastoreParquet”,“false”)
    alter table qwe change amount amount decimal(18,7)