pyspark IllegalArgumentException:转置要求所有集合具有相同的大小

nxowjjhe  于 2023-10-15  发布在  Spark
关注(0)|答案(2)|浏览(111)

我在ADLS不同的文件夹下的Parquet文件,我想把它们合并成一个。路径的文件夹结构如下
我运行下面的代码来做到这一点,但得到一个错误说**“IllegalArgumentException:转置要求所有集合具有相同的大小”**

files = dbutils.fs.ls('abfss://[email protected]/UserData/folder1/folder2/folder3/')

combined_df = None
for fi in files: 
    df = spark.read.parquet(fi.path)
    if combined_df == None:
       combined_df = df
    else:
      combined_df = combined_df.union(df)

有谁能帮忙解决这个错误吗?
任何帮助将不胜感激!

vojdkbi0

vojdkbi01#

有一种更简单、更快速、更有效的方法可以将文件夹中的所有parquet文件读取到spark框架中,而不是循环遍历dbutils.fs.ls()返回的文件路径列表。

path = 'abfss://[email protected]/UserData/folder1/folder2/folder3/'

# use recursiveFileLookup if you have data in sub-folders
combined_df = spark.read.format("parquet")\
    .option("recursiveFileLookup", "true")\
    .load(path)

如果你不需要递归,但需要所有的文件,只需:

combined_df = spark.read.format("parquet").load(path)

https://spark.apache.org/docs/latest/sql-data-sources-generic-options.html#recursive-file-lookup

ncecgwcz

ncecgwcz2#

我不知道为什么但是如果你在union之后使用.distinct(),代码将工作:

combined_df = combined_df.union(df).distinct()

相关问题