如何处理无法使用传递给 pyspark 中的 mapPartitions() 的函数内的 print 语句调试代码的问题?
考虑这个例子:
def func(kv_iterator):
for key, value in iterator:
#do fancy stuff
print('This print statement does not reach the driver program')
return [result]
result = someRdd.mapPartitions(func)
在 func 内部,我想对可迭代和索引进行大量工作,但我可以测试我的代码,而无需在 func 内部使用过多的变量。
是否可以以某种方式将打印语句从一个分区重定向到我的驱动程序/输出通道?
您可以使用以下其中一项:
local
模式。所有输出都应该在控制台中可见。如果不是,您的代码可能永远不会执行 - 尝试 result.count()
、result.foreach(lambda _: None)
或其他操作 - 这可能就是这里的问题。将 stdout(以及 stderr,如果需要)重定向到文件。对于基本
prints
使用 file
参数:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
使用远程调试器 - 如何在调试模式下调用pyspark?
但最重要的是——在 Spark 之外测试功能。与
mapPartitions
一起使用的函数应该接受 Iterable
(具体实现通常是 itertools.chain
)并返回 Iterable
。