Spark Parquet读写中的类型更改支持

时间:2018-08-31 09:36:43

标签: apache-spark schema parquet

通过火花阅读镶木地板时遇到一个问题。

已写入一个实木复合地板文件,其字段a的类型为Integer。之后,以a的{​​{1}}模式读取此文件会产生异常。

  

原因:java.lang.UnsupportedOperationException:未实现   类型:LongType at   org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.readIntBatch(VectorizedColumnReader.java:397)     在   org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.readBatch(VectorizedColumnReader.java:199)     在   org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextBatch(VectorizedParquetRecordReader.java:263)     在   org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextKeyValue(VectorizedParquetRecordReader.java:161)     在   org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39)     在   org.apache.spark.sql.execution.datasources.FileScanRDD $$ anon $ 1.hasNext(FileScanRDD.scala:106)

我认为支持此兼容的类型更改。但这是行不通的。

此代码段

Long

对此的任何帮助都非常感激。

1 个答案:

答案 0 :(得分:1)

由于镶木地板是Hadoop的基于列的存储格式,因此它也保留数据的数据类型。因此,在读取具有不同数据类型的镶木地板时,即使其上浮,也不会自动处理。

您需要专门投射数据

val colarraywithcast = Array(col(“ eid”),col(“ did”),col(“ seal”)。cast(LongType))

df.select(colarraywithcast:_ *)。printSchema