Spark分布式PDF文本提取:lambda参数缺失及路径传参问题求助
解决Spark binaryFiles调用自定义PDF提取函数的参数问题
我来帮你搞定这个问题!你的核心问题是没正确处理sc.binaryFiles返回的RDD元素结构,以及Python3对lambda参数解构的限制。
问题根源
sc.binaryFiles返回的RDD中,每个元素是**(文件路径字符串, 二进制内容)**的二元组。你最初的两种lambda写法都有问题:
- 第一种写法
lambda filename, content: ...在Python3里是无效的,因为lambda不能直接解构元组参数(Python2支持,但Python3已经移除了这个语法),所以Spark会把整个二元组作为单个参数传给lambda,导致提示缺少content参数。 - 第二种写法
lambda filename: ...里的filename其实是整个二元组,所以你传给extractTextFromPdf的不是文件路径,而是(路径, 字节流)这个元组,自然不符合函数的参数要求。
修正后的代码
你需要正确获取二元组中的文件路径字段,修改后的代码如下:
#!/usr/bin/env python3 import ScannedTextExtractor.STE as STE from pyspark import SparkContext sc = SparkContext("local", "STE") input_rdd = sc.binaryFiles("/home/ubuntu/files") # 正确获取二元组中的文件路径,调用提取函数 processed = input_rdd.map(lambda item: STE.extractTextFromPdf(item[0], 'ste-config.yaml')) print("Results:") print(processed.take(2))
如果想同时保留文件名和提取结果,可以这样写:
processed = input_rdd.map(lambda item: (item[0], STE.extractTextFromPdf(item[0], 'ste-config.yaml')))
分布式环境的重要注意事项
这里要提醒你:在分布式Spark集群中,每个executor节点必须能访问到/home/ubuntu/files下的PDF文件,以及ste-config.yaml配置文件。如果你的文件是存放在driver节点的本地路径,executor节点很可能无法访问,这时候你需要:
- 将PDF文件上传到HDFS、S3或集群共享存储中,确保所有节点都能通过统一路径访问。
- 将
ste-config.yaml通过sc.addFile()分发到所有executor节点,然后在函数中用SparkFiles.get('ste-config.yaml')获取路径:from pyspark import SparkFiles sc.addFile("ste-config.yaml") processed = input_rdd.map(lambda item: STE.extractTextFromPdf(item[0], SparkFiles.get('ste-config.yaml')))
这样就能确保在分布式环境下配置文件能被所有节点正确读取啦!
内容的提问来源于stack exchange,提问作者Jayce444
相关产品推荐
相关产品推荐

