【问题标题】:Type change support in spark parquet read-writespark parquet 读写中的类型更改支持
【发布时间】:2021-03-28 20:16:54
【问题描述】:

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

已使用类型为Integer 的字段a 编写了一个镶木地板文件。之后,使用 a 的架构读取此文件为 Long 会出现异常。

原因:java.lang.UnsupportedOperationException:未实现 类型:LongType 在 org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.readIntBatch(VectorizedColumnReader.java:397) 在 org.apache.spark.sql.execution.datasources.parquet.VectorizedColumnReader.readBatch(VectorizedColumnReader.java:199) 在 org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextBatch(VectorizedParquetRecordReader.java:263) 在 org.apache.spark.sql.execution.datasources.parquet.VectorizedParquetRecordReader.nextKeyValue(VectorizedParquetRecordReader.java:161) 在 org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39) 在 org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:106)

我认为支持这种兼容的类型更改。但这不起作用。

这个代码sn-p:

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】:

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

    您需要专门转换数据

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

    【讨论】:

    • 是的钱丹。同意。但我有多个不同模式的镶木地板文件(但都是兼容的)。我想用模式的超集一口气读完所有这些。
    • 它有效,但主要我想知道是否支持向上转换。你提到它不受支持。 :)
    • 我在这里说向上转换或扩大意味着将较低的数据类型转换为较高的数据类型,即您的示例是向上转换的,我说它不是隐式的。你需要像我在答案中提到的那样投射它
    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2019-04-24
    • 2020-05-03
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多