我如何处理我无法使用print函数调试我的代码的问题,我在pyspark中传递给mapPartitions()函数?
考虑一下这个例子:
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中有多余的变量。
是否有可能以某种方式将print语句从一个分区重定向到我的驱动程序/输出通道?
答案 0 :(得分:2)
您可以使用以下其中一项:
local
模式。所有输出都应该在控制台中可见。如果不是,您的代码可能永远不会执行 - 请尝试result.count()
,result.foreach(lambda _: None)
或其他操作 - 这可能是此处的问题。将stdout(和stderr,如果需要)重定向到文件。对于基本prints
使用file
参数:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
使用远程调试器 - How can pyspark be called in debug mode?
但最重要的是 - Spark之外的测试功能。与mapPartitions
一起使用的函数应接受Iterable
(具体实现通常为itertools.chain
)并返回Iterable
。