Pyspark:从不同的目录加载类似的镶木地板,并将文件夹名称作为一列组合成一个 DataFrame [重复]

Posted

技术标签:

【中文标题】Pyspark:从不同的目录加载类似的镶木地板,并将文件夹名称作为一列组合成一个 DataFrame [重复]【英文标题】:Pyspark: Load similar parquets from different directories and combine into one DataFrame with the folder name as a column [duplicate] 【发布时间】:2021-02-04 15:18:10 【问题描述】:

我有几个类似文件夹结构的镶木地板:

'/raw-files/17001/result.parquet'
'/raw-files/17002/result.parquet'
'/raw-files/...../result.parquet'
'/raw-files/18000/result.parquet'

我想将所有镶木地板组合到一个 DataFrame 中,同时添加一列,使用唯一文件夹名称(17001、17002、.....、18000)作为区分它们的关键。到目前为止我有

raw_files=os.listdir('raw-files')

创建所有唯一文件夹名称的列表,然后通过遍历这些目录并读取 parquets 创建 DataFrames 字典。

df_dict = 
for folder in raw_files:
    path = 'raw-files/' +folder+'/' 
    df_dict[folder] = spark.read.parquet(path +'results.parquet').withColumn('Key',lit(folder))

所以现在我有一个包含所需键列的 Spark DataFrames 字典,但我不确定如何将它们减少为单个 DataFrame。我知道有办法用 Pandas 做到这一点,但我想坚持使用 Spark 框架。在 Spark 中也可能有一种更简单的方法来做到这一点,我只是忽略了它。

【问题讨论】:

@mck,我以前看到过,但它只是给了我一个可行的想法。我可以使用列表而不是使用字典来存储数据帧,并且上面链接的解决方案有效。 【参考方案1】:

我没有将数据帧存储在字典中,而是使用了列表。

df_dict = []
for folder in raw_files:
    path = 'raw-files/' +folder+'/' 
    df_dict.append(spark.read.parquet(path +'results.parquet').withColumn('Key',lit(folder)))

从那里,我可以使用解决方案mck linked

df = reduce(DataFrame.unionAll, df_dict)

如果有人有更有效的方法,请告诉我!

【讨论】:

以上是关于Pyspark:从不同的目录加载类似的镶木地板,并将文件夹名称作为一列组合成一个 DataFrame [重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Pyspark 2.4.4 读取 s3 存储桶中的镶木地板文件

我对镶木地板文件和 python 完全陌生,谁能告诉我如何在 pyspark 中读取带有标题的镶木地板文件

Pyspark Parquet - 重新分区后排序

手动选择镶木地板分区与在 pyspark 中过滤它们

如何从 pyspark 数据框的模式属性(来自镶木地板文件)中获取特定字段名称的数据类型?

从目录读取镶木地板文件时,pyspark不保存