gpt4 book ai didi

apache-spark - spark parquet 读写中的类型更改支持

转载 作者:行者123 更新时间:2023-12-04 13:02:34 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com