我在通过火花阅读镶木地板时遇到了一个问题。
一个镶木地板文件用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()
对此有任何帮助非常感谢。
如同镶木地板是Hadoop的基于列的存储格式,因此它也保留了数据的数据类型。因此,在阅读具有不同数据类型的镶木地板时,即使它的向上转换它也不会自动处理。
您需要专门投射数据
val colarraywithcast = Array(col(“eid”),col(“did”),col(“seal”)。cast(LongType))
df.select(colarraywithcast:_ *)printSchema。