You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PySpark将MongoDB数据展示在Tkinter界面中

如何将PySpark读取的MongoDB数据展示在Tkinter界面中

show()方法仅能在控制台打印Spark DataFrame内容,无法直接在Tkinter界面渲染。要实现界面展示,需要将Spark分布式数据转换为本地可处理的格式,再通过Tkinter的ttk.Treeview组件构建表格展示。

解决步骤

  1. 将Spark DataFrame转换为本地数据结构
    使用collect()方法将分布式数据拉取到本地,得到Row对象组成的列表;同时提取DataFrame的列名作为表格表头。

  2. 用Treeview构建可视化表格
    创建Treeview组件,设置对应列名,再逐行插入数据。为了优化体验,可添加滚动条支持数据滚动查看。

修改后的完整代码

from pyspark.sql import SparkSession
import tkinter as tk
from tkinter import ttk

# 初始化SparkSession连接MongoDB
spark = SparkSession \
    .builder \
    .appName("myApp") \
    .master('local')\
    .config("spark.mongodb.read.connection.uri", "mongodb+srv://user:12345@doan.tyemsow.mongodb.net") \
    .config("spark.mongodb.write.connection.uri", "mongodb+srv://user:12345@doan.tyemsow.mongodb.net") \
    .config("spark.jars.packages","org.mongodb.spark:mongo-spark-connector_2.12:3.0.1")\
    .getOrCreate()

# 读取MongoDB数据
dataFrame = spark.read\
                 .format('com.mongodb.spark.sql.DefaultSource')\
                 .option("uri","mongodb+srv://user:12345@doan.tyemsow.mongodb.net/sample_guides.planets")\
                 .load()

# 准备展示数据:拉取本地并提取列名
columns = dataFrame.columns
# 若数据量较大,建议添加limit限制,避免内存溢出:dataFrame.limit(100).collect()
rows = dataFrame.collect()

# 初始化Tkinter界面
r = tk.Tk()
r.title('planet')
r.geometry('1000x500')

# 创建Frame和滚动条
frm = ttk.Frame(r)
frm.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

# 垂直滚动条
v_scroll = ttk.Scrollbar(frm, orient=tk.VERTICAL)
v_scroll.pack(side=tk.RIGHT, fill=tk.Y)

# 水平滚动条
h_scroll = ttk.Scrollbar(frm, orient=tk.HORIZONTAL)
h_scroll.pack(side=tk.BOTTOM, fill=tk.X)

# 创建Treeview表格
tree = ttk.Treeview(frm, columns=columns, show='headings', yscrollcommand=v_scroll.set, xscrollcommand=h_scroll.set)
tree.pack(fill=tk.BOTH, expand=True)

# 绑定滚动条
v_scroll.config(command=tree.yview)
h_scroll.config(command=tree.xview)

# 设置表头
for col in columns:
    tree.heading(col, text=col)
    # 设置列宽,可根据需求调整
    tree.column(col, width=120)

# 插入数据行
for row in rows:
    # 将Row对象转换为元组
    tree.insert('', tk.END, values=tuple(row))

r.mainloop()

注意事项

  • 若数据集过大,直接使用collect()会将所有数据加载到本地内存,可能导致内存不足。建议通过dataFrame.limit(N)限制展示的数据量,或实现分页加载逻辑。
  • 可根据需求调整Treeview的列宽、样式,优化界面展示效果。

内容的提问来源于stack exchange,提问作者Nguyn Phan ng S 2174802010878

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 08:37:50