spark parquet 读写中的类型更改支持

Type change support in spark parquet read-write

我在通过 spark 读取 parquet 时遇到了一个问题。

一个 parquet 文件已写入类型为 Integer 的字段 a。之后,使用 a 作为 Long 的模式读取此文件会给出异常。

Caused by: java.lang.UnsupportedOperationException: Unimplemented type: LongType at org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.readIntBatch(VectorizedColumnReader.java:397) at org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.readBatch(VectorizedColumnReader.java:199) at org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextBatch(VectorizedParquetRecordReader.java:263) at org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextKeyValue(VectorizedParquetRecordReader.java:161) at org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39) at org.apache.spark.sql.execution.datasources.FileScanRDD$$anon.hasNext(FileScanRDD.scala:106)

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

此代码片段:

val oldSchema = StructType(StructField("a", IntegerType, true) :: Nil)

val df1 = spark.read.schema(oldSchema).json("/path/to/json/data")

df1.write.parquet("/path/to/parquet/data")

val newSchema = StructType(StructField("a", LongType, true) :: Nil)

spark.read.schema(newSchema).parquet("/path/to/parquet/data").show()

非常感谢您提供任何帮助。

因为 parquet 是 Hadoop 的基于列的存储格式,所以它也保持数据的数据类型。因此,在读取具有不同数据类型的镶木地板时,即使它正在向上转换,也不会自动处理。

您需要专门投射数据

val colarraywithcast = Array(col("eid"),col("did"),col("seal").cast(LongType))
    
df.select(colarraywithcast:_*).printSchema