Apache spark 如何使用Spark修复拼花文件分区中不一致的模式

Apache spark 如何使用Spark修复拼花文件分区中不一致的模式,apache-spark,pyspark,azure-data-lake,databricks,azure-databricks,Apache Spark,Pyspark,Azure Data Lake,Databricks,Azure Databricks,我是spark的新手,在向分区添加新数据时遇到了一个问题。我的管道使用Datatrick将每日CSV导入Azure Datalake(基本上是HDFS)。我还对数据运行了一些简单的转换,并删除了重复项等。但是,我注意到,有时inferSchema=True选项并不总是最好的,有时会在分区文件之间的模式中产生不一致。然后,当我阅读所有文件时: df = sqlContext.read.parquet("path/to/directory") 我被一个: Parquet column cannot

我是spark的新手,在向分区添加新数据时遇到了一个问题。我的管道使用Datatrick将每日CSV导入Azure Datalake(基本上是HDFS)。我还对数据运行了一些简单的转换,并删除了重复项等。但是,我注意到,有时
inferSchema=True
选项并不总是最好的,有时会在分区文件之间的模式中产生不一致。然后,当我阅读所有文件时:

df = sqlContext.read.parquet("path/to/directory")
我被一个:

Parquet column cannot be converted in file path/to/directory/file
Column: [Ndc], Expected: LongType, Found: BINARY
我有大量的分区文件,并仔细检查每一个文件,以确定模式是否相同,修复每一个文件可能效率不高。是否有一种简单的方法来强制执行所有文件都将转换为的模式,或者您确实需要迭代每个拼花地板文件并更改模式

使用spark 2.3.1


谢谢。

您可以尝试两种选择

  • 您可以使用“mergeSchema”选项来合并具有不同模式的两个文件

  • 循环遍历每个单独的文件,读取时使用推断模式,然后显式转换为公共模式并写回另一个位置


  • 如果您事先知道模式,那么就用schema选项指定它,并去掉inferschema选项。我对较新的数据这么做了,但是对于我已经编写的文件呢?对于较旧的文件也可以这样做,如果没有,您可以试着使用类似spark.read.parquet()的casting。with column(“Ndc”,$“Ndc.cast(Long type))是的,不幸的是mergeSchema选项失败了,所以我将开始在每个文件中循环!