【发布时间】:2018-01-08 10:55:21
【问题描述】:
我正在尝试使用 Spark 在多个服务器之间分发一些从 PDF 中提取的文本。这是使用我制作的自定义 Python 模块,是implementation of this question。 “extractTextFromPdf”函数有 2 个参数:一个表示文件路径的字符串,以及一个用于确定各种提取约束的配置文件。在这种情况下,配置文件只是一个简单的 YAML 文件,与运行提取的 Python 脚本位于同一文件夹中,并且这些文件只是在 Spark 服务器之间复制。
我遇到的主要问题是能够使用文件名而不是文件的内容作为第一个参数来调用我的提取函数。这是我目前拥有的基本脚本,在 files 文件夹中的 2 个 PDF 上运行它:
#!/usr/bin/env python3
import ScannedTextExtractor.STE as STE
from pyspark import SparkContext
sc = SparkContext("local", "STE")
input = sc.binaryFiles("/home/ubuntu/files")
processed = input.map(lambda filename, content: (STE.extractTextFromPdf(filename,'ste-config.yaml'), content))
print("Results:")
print(processed.take(2))
这会产生 lambda 错误 Missing 1 position argument: 'content'。我并不真正关心使用 PDF 的原始内容,因为我的提取函数的参数只是 PDF 的路径,而不是实际的 PDF 内容本身,我试图只给 lambda 函数提供 1 个参数。例如
processed = input.map(lambda filename: STE.extractTextFromPdf(filename,'ste-config.yaml'))
但是我遇到了问题,因为使用此设置 Spark 将 PDF 内容(作为字节流)设置为这个单数参数,但我的模块需要一个带有 PDF 路径的字符串作为第一个参数,而不是整个字节内容PDF。
我打印了 SparkContext 加载的二进制文件的 RDD,我可以看到 RDD 中有文件名和文件内容(PDF 的字节流)。但是如何将它与需要以下语法的自定义 Python 模块一起使用:
STE.extractTextFromPDF('/path/to/pdf','/path/to/config-file')
我已经尝试了 lambda 函数的多种排列,我已经三次检查了 Spark 的 RDD 和 SparkContext API。我似乎无法让它工作。
【问题讨论】:
标签: python apache-spark lambda pyspark rdd