我在通过 Spark 阅读 Parquet 时遇到了一个问题。
一个 Parquet 文件已写入字段 a
类型 Integer
.之后,使用 a
的架构读取此文件如 Long
给出异常(exception)。
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$1.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 的基于列的存储格式,因此它也保留了数据的数据类型。因此,在读取具有不同数据类型的 Parquet 时,即使它正在向上转换,也不会自动处理。
你需要专门投数据
val colarraywithcast = Array(col("eid"),col("did"),col("seal").cast(LongType))
df.select(colarraywithcast:_*).printSchema
关于apache-spark - spark parquet 读写中的类型更改支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52112557/