Apache spark 如何使用Pyspark并行处理多个拼花地板文件?

Apache spark 如何使用Pyspark并行处理多个拼花地板文件?,apache-spark,pyspark,parallel-processing,databricks,Apache Spark,Pyspark,Parallel Processing,Databricks,我正在使用Azure Databricks,而且我是Pyspark和大数据的新手 我的问题是: 我在azure databricks上的目录中有几个拼花文件。 我想将这些文件读取到pyspark数据帧中,并使用drop duplicates方法删除重复的行—QA检查。 然后,我想在删除重复项后覆盖同一目录中的这些文件 目前,我正在使用for循环来循环目录中的每个拼花地板文件。然而,这是一种效率低下的做事方式。我想知道是否有一种方法可以并行处理这些拼花地板文件以节省计算时间。如果是,我需要如何更改

我正在使用Azure Databricks,而且我是Pyspark和大数据的新手

我的问题是:

我在azure databricks上的目录中有几个拼花文件。 我想将这些文件读取到pyspark数据帧中,并使用drop duplicates方法删除重复的行—QA检查。 然后,我想在删除重复项后覆盖同一目录中的这些文件

目前,我正在使用for循环来循环目录中的每个拼花地板文件。然而,这是一种效率低下的做事方式。我想知道是否有一种方法可以并行处理这些拼花地板文件以节省计算时间。如果是,我需要如何更改代码

代码如下:

for parquet_file_name in dir:
     df = spark.read.option("header", "true").option("inferschema", "false").parquet('{}/{}'.format(dir,parquet_file_name))
     df.dropDuplicates().write.mode('overwrite').parquet('{}/{}'.format(dir,parquet_file_name)
这里的任何帮助都将不胜感激


非常感谢

与其在for循环中一次读取一个文件,不如像这样读取整个目录

 df = spark.read \
    .option("header", "true") \
    .option("inferschema", "false").parquet(dir)


df.dropDuplicates().write.mode('overwrite').parquet(dir)

现在将按预期一次性读取所有数据。如果要更改写入的文件数,请在
.write
函数之前使用
coalesce
命令,如下所示:
df.dropDuplicates().coalesce(4).write.mode('overwrite')。parquet(dir)

警告:Spark无法将数据帧写入与其源相同的目录。Spark延迟读取,并且
mode('overwrite')
将破坏数据帧表示的基础数据。@CharlieFlowers我认为Spark无法写入其源目录的说法不正确。这可能不是一个好的做法,但上述功能按预期工作。您确定吗?它可能依赖于文件系统,但使用Spark 2.4.3:>>>df=Spark.read\。选项(“标题”、“真”)\。选项(“推断模式”、“假”).parquet(“tst_parquet”)>>>df.dropDuplicates().write.mode(“覆盖”).parquet(“tst_parquet”)20/01/03 18:06:35错误执行者:第1.0阶段(TID 1)任务0.0中的异常java.io.FileNotFoundException:File File:/Users/charlie/tst_parquet/part-00003-fcdf8911-53f0-4139-868b-81048e20b896-c000.snapy.parquet不存在底层文件可能已更新。您可以显式地使…@CharlieFlowers无效,我承认它可能无法从hdfs/dbfs这样的文件系统读取数据。我用S3中的一个文件测试了它,它成功了。我还使用Spark 2.4.3进行了测试。