如何在Shell环境中使用Matplotlib绘制PySpark SQL查询结果
嘿,我懂你碰到的问题了——在PySpark Shell里运行Matplotlib代码,结果只返回了<matplotlib.axes.AxesSubplot object at 0x7f1cd604b690>这样的对象,却看不到实际的图表,对吧?这是因为Shell环境下Matplotlib的默认设置和交互式笔记本(比如Jupyter)不一样,得调整几步才能让图表显示出来。
下面是具体的解决步骤:
1. 先确认Matplotlib的后端设置
Matplotlib需要合适的后端来渲染图表,在Shell环境里默认可能不是交互式的。导入Matplotlib后,先设置一个支持交互式显示的后端:
import matplotlib.pyplot as plt # 根据你的系统选择合适的后端,比如TkAgg、QtAgg或者GTK3Agg plt.switch_backend('TkAgg')
如果你的系统没有这些后端依赖,也可以用Agg后端(非交互式),但这种情况只能把图表保存成文件,没法实时显示。
2. 生成图表后必须调用plt.show()
你之前的代码应该只是执行了绘图操作,但没触发显示。不管你是用Pandas的plot方法还是直接用Matplotlib的API,最后都要加上plt.show()来弹出图表窗口。举个完整的例子:
# 假设你已经从PySpark SQL拿到了结果DataFrame from pyspark.sql import SparkSession spark = SparkSession.builder.appName("MatplotlibDemo").getOrCreate() # 示例数据:创建一个简单的PySpark DataFrame data = [("A", 10), ("B", 20), ("C", 15)] df = spark.createDataFrame(data, ["category", "count"]) # 转换成Pandas DataFrame(因为Matplotlib不直接支持PySpark DataFrame) pandas_df = df.toPandas() # 绘图 pandas_df.plot(kind='bar', x='category', y='count') plt.title('Category Count Distribution') plt.xlabel('Category') plt.ylabel('Count') # 关键:调用show()显示图表 plt.show()
执行这段代码后,应该就能弹出一个包含图表的窗口了。
3. 如果是远程服务器上的PySpark Shell
如果你是通过SSH连接到远程服务器运行PySpark Shell,那直接显示图表可能会有问题(因为没有图形界面)。这种情况下,你可以把图表保存成图片文件:
# 替换plt.show()为savefig() plt.savefig('category_count_plot.png')
运行后,服务器上就会生成category_count_plot.png文件,你可以把它下载到本地查看。
最后解释下为什么会返回那个AxesSubplot对象:其实这是正常的——plot()方法本身就会返回对应的坐标轴对象,只是在Shell环境下,没有自动触发显示,所以你只看到了这个对象的描述,加上plt.show()就能让图表显示出来啦。
内容的提问来源于stack exchange,提问作者iratelilkid

