火花实木复合地板读写中的类型更改支持

问题描述 投票:1回答:1

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

一个镶木地板文件用a类型的字段Integer编写。之后,使用a的模式读取此文件作为Long会给出异常。

引发者:java.lang.UnsupportedOperationException:未实现的类型:org.apache.spark.spark.sql.execution.datasources中org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.readIntBatch(VectorizedColumnReader.java:397)的LongType .parquet.VectorizedColumnReader.readBatch(VectorizedColumnReader.java:199)位于org.apache.spark.sql.execution.datasources的org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextBatch(VectorizedParquetRecordReader.java:263) .parquet.VectorizedParquetRecordReader.nextKeyValue(VectorizedParquetRecordReader.java:161)位于org.apache.spark.spark.sql.execution.datasources.FileScanRDD的org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39) $$匿名$ 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()

对此有任何帮助非常感谢。

apache-spark schema parquet
1个回答
1
投票

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

您需要专门投射数据

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

df.select(colarraywithcast:_ *)printSchema。

© www.soinside.com 2019 - 2024. All rights reserved.