PySpark 结构化流输出在 Jupyter Notebook 上不显示
在本文中,我们将介绍 PySpark 结构化流输出在 Jupyter Notebook 上不显示的问题,并提供解决方法。
阅读更多:PySpark 教程
问题描述
在使用 Jupyter Notebook 运行 PySpark 结构化流作业时,有时会遇到输出不显示的问题。即使代码运行正常,也无法在 Notebook 中看到输出结果。这可能会给调试和开发过程带来困扰。
问题原因
这个问题的原因是因为 Jupyter Notebook 默认情况下只会显示标准输出(stdout),而不会显示标准错误输出(stderr)。然而,结构化流输出通常是通过标准错误输出流进行呈现的。因此,在默认设置下,我们无法在 Notebook 中看到结构化流的输出。
解决方法
方法一:使用 display 函数
PySpark 提供了一个 display 函数,可以在 Jupyter Notebook 中以表格形式显示 DataFrame。可以通过将结构化流转换为 DataFrame,并使用 display 函数来解决输出不显示的问题。
下面是示例代码:
from pyspark.sql import SparkSession
# 创建 SparkSession
spark = SparkSession.builder \
.appName("StructuredStreamingOutput") \
.getOrCreate()
# 读取结构化流数据
streamingDF = spark \
.readStream \
.format("csv") \
.option("header", True) \
.option("inferSchema", True) \
.load("path/to/input")
# 执行一些转换操作,得到结果 DataFrame
resultDF = streamingDF.select("column1", "column2") \
.groupBy("column1") \
.count()
# 使用 display 函数显示结果 DataFrame
display(resultDF)
通过使用 display 函数,我们可以在 Notebook 中以表格形式看到结果 DataFrame。
方法二:使用 writeStream 查询输出
另一种解决方法是使用 writeStream 查询输出的方式,将结构化流输出保存为文件或者发送到外部系统,然后通过查看这些输出来验证流查询的结果。
下面是示例代码:
from pyspark.sql import SparkSession
# 创建 SparkSession
spark = SparkSession.builder \
.appName("StructuredStreamingOutput") \
.getOrCreate()
# 读取结构化流数据
streamingDF = spark \
.readStream \
.format("csv") \
.option("header", True) \
.option("inferSchema", True) \
.load("path/to/input")
# 执行一些转换操作,得到结果 DataFrame
resultDF = streamingDF.select("column1", "column2") \
.groupBy("column1") \
.count()
# 将结果保存为文件
query = resultDF \
.writeStream \
.outputMode("complete") \
.format("csv") \
.option("checkpointLocation", "path/to/checkpoint") \
.option("path", "path/to/output") \
.start()
# 等待流查询完成
query.awaitTermination()
在这个例子中,我们将结果 DataFrame 保存为 CSV 文件,并指定了检查点和输出路径。通过查看保存的文件,我们可以验证流查询的结果。
总结
在本文中,我们介绍了 PySpark 结构化流输出在 Jupyter Notebook 上不显示的问题,并提供了两种解决方法。通过使用 display 函数或者将结果保存为文件,我们可以在 Notebook 中查看结构化流的输出。这些方法可以帮助我们进行调试和开发工作,提高工作效率。希望本文对你有所帮助!