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
我在通过 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