如何使用 PySpark 在桌面本地文件夹的目录中执行文件(pdf、docs、txt、xls)的并行处理?

Posted

技术标签:

【中文标题】如何使用 PySpark 在桌面本地文件夹的目录中执行文件(pdf、docs、txt、xls)的并行处理?【英文标题】:How to perform parallel processing of files (pdf,docs,txt, xls) in a directory on local folder on Desktop using PySpark? 【发布时间】:2019-04-26 16:07:02 【问题描述】:

我在本地桌面上的单个目录中的不同子目录中有大约 9000 个文件。目录的总大小约为 15GB。我不想通过 python 编程方法,这非常耗时。我想对任务使用某种分布式并行处理。我要执行以下操作

以并行方式提取所有这些文件。 从这些文档中提取文本(我已经有一个基于 tika 的 python 脚本来从这些文件中提取文本) 将文件名和内容(提取的文本)存储在数据框中。

我已经使用普通的 python 脚本完成了上述任务。但我想使用 Spark/pySpark 来执行上述任务。我以前从未使用过 Spark,因此需要一些关于路线图的指导。

如何将这些文档并行传递给 Spark,然后将我的提取脚本应用于这些文档?我可以采取什么方法?

【问题讨论】:

遍历您的目录,使用 Tika 解析器获取并解析每个文件,然后将结果绑定到数据帧。否则,您必须为每种文件格式编写基于 Apache Tike 的自定义阅读器。还要每 N 次迭代进行一次计算,因为如果你一次对所有文档执行 DAG 将会非常繁重 是的,我目前正在使用 Apache Tika。 【参考方案1】:

spark 不适用于 pdf、xls、docx 格式。这些格式有自己的压缩类型,不能很好地并行化。它们需要完全加载到内存中才能解压缩。

首选的压缩格式是面向列的压缩格式,例如 parquet、orc 或平面文件(例如 json、txt... >

如果您碰巧只有文本文件、具有不同结构或非结构化的文本文件,那么我建议使用 spark 的 RDD API 来读取它们:

sc.wholeTextFiles(input_directory)

这将加载每个文本文件的内容并将文件名附加到每个记录。

否则,在 python 中使用 multiprocessing 并行化会更有效。

【讨论】:

哦,不,我有 pdf、docx、excel 和图像格式。是的,目前我在 python 中使用多处理。但是考虑到文件的数量,这也需要很多时间。 您将始终受到服务器上 vcore 数量的限制。您可以更快地处理这些文件的唯一方法是:优化您的代码、扩大规模(获得更大的服务器)或扩大规模(将您的工作拆分到多台服务器上,以便每个服务器处理一个批次,然后连接结果) 如何将目录结构保存为 csv 格式,其中一列直接包含每个文件的路径。然后将此 csv 给 spark 引擎以并行化和映射一个函数,以根据它正在处理的每个文件(每一行)的不同扩展类型提取文本。 UDF 中应用计算的速度只会与您的 python 进程一样快。您在资源管理器编排的任务中运行它并不意味着这种类型的工作,这一事实不会使其更快。您甚至会失去宝贵的资源给经理分配任务。此外,可以并行运行的任务数是您服务器上的 vcore 数 像您这样的 CPU 密集型进程由 linux shell 比分布式语言更好地处理。他们更擅长处理 RAM 密集型进程

以上是关于如何使用 PySpark 在桌面本地文件夹的目录中执行文件(pdf、docs、txt、xls)的并行处理?的主要内容,如果未能解决你的问题,请参考以下文章

pyspark - 如果本地目录已经存在,如何删除它[重复]

如何将 pyspark 中的数据保存在 Amazon EMR 的 1 个文件中

在 Databricks PySpark 中本地保存文件

如何从 pyspark 数据框中更快地保存 csv 文件?

在 pySpark (2.3) 中读取本地 csv 文件

pyspark 给出以下错误无法在 /tmp 中创建本地目录