>我在Jupyter pyspark笔记本中运行一个非常非常简单的脚本,但它在运行时不会打印结果,它只是在完成后吐出输出。这是代码:
import time
import sys
for i in range(10):
print(i)
time.sleep(1)
这将等待 10 秒,然后打印:
0
1
2
3
4
5
6
7
8
9
我想打印发生的结果。我试图用
for i in range(10):
print(i)
sys.stdout.flush()
print(i, flush=True)
无济于事。有什么建议吗?
这是一个缓冲问题。 你也可以使用python -u命令或设置 PYTHONUNBUFFERED envvar。python 如果以交互方式运行(在终端中)则使用行缓冲,如果输出被重定向,则使用块缓冲(例如,~4K 字节缓冲区)
根据您正在执行的操作,如果您正在运行 pyspark 代码并希望在作业完成之前看到结果,这可能不起作用。
您可能会遇到有关 spark/pyspark 如何运行代码的问题。Spark 旨在有效地将您的任务划分为多个部分,并将这些部分分发到 EMR 集群的节点。
这意味着实际工作不会在运行笔记本的计算机上发生。运行笔记本的主节点将任务发送到所有工作器节点,然后在发送回结果时收集结果,并且仅在作业完成后显示它们。对于习惯于调试普通 python 的人来说,这可能会很麻烦,但这是在处理大量数据时使 pyspark 如此快速的重要原因。