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 中读取带有标题的镶木地板文件