pyspark:ORC 不支持从文件类型字符串 (1) 到读取器类型数组 <struct>(1) 的类型转换



我使用pyspark=3.0.0dev2读取了本地存储的orc文件。原始文件的模式如下:

root
|-- dat: string (nullable = true)
|-- order_id: string (nullable = true)
|-- passenger_num: string (nullable = true)
|-- is_agency: string (nullable = true)
|-- coordinates: array (nullable = true)
|    |-- element: struct (containsNull = true)
|    |    |-- time_stamp: long (nullable = true)
|    |    |-- lng: double (nullable = true)
|    |    |-- lat: double (nullable = true)
|    |    |-- speed: double (nullable = true)

我使用分解"坐标"列

explodeDF = df.select(explode("coordinates").alias("cor"))
flattenDF = explodeDF.selectExpr("cor.time_stamp", "cor.lng", "cor.lat", "cor.speed")

在分解原始数据后,我得到了一个新的平面DF。但当我显示它使用flattenDF.show()时,我得到的错误如下:

Py4JJavaError: An error occurred while calling o236.count.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 3 in stage 6.0 failed 1 times, most recent failure: Lost task 3.0 in stage 6.0 (TID 54, WIN-VQVQVO99M5A, executor driver): org.apache.orc.impl.SchemaEvolution$IllegalEvolutionException: ORC does not support type conversion from file type string (1) to reader type array<struct<time_stamp:bigint,lng:double,lat:double,speed:double>> (1)

我该如何解决这个问题。

我尝试了一些解决方案:我读取了名为a的原始orc文件,将其直接写入本地文件系统a_new,然后读取a_new并运行代码,完美无误。所以,我想这是一个版本问题。

当我将版本更改为spark 2.4.5时,神奇的事情发生了。代码不会报告错误。

所以,当你遇到和我一样的错误时,你可以检查你的spark版本是否是3.0。并将其更改为2.4.5。

相关内容