在笔记本中直观呈现 Spark DataFrame

您可以使用 google-colabsqlviz Python 软件包和 Managed Service for Apache Spark,在 Jupyter 笔记本中以交互方式探索 PySpark DataFrame,包括 Google Cloud Data Agent Kit (DAK)。google-colabsqlviz 基于 anywidget 构建,由数据洞察图表引擎提供支持,可在笔记本单元格输出中呈现交互式可视化,而无需绘制代码。

将 DataFrame 传递给 google-colabsqlviz 时,您可以在图表和数据表视图之间切换、配置维度和指标、应用聚合、以交互方式对数据进行排序或过滤,以及将过滤或聚合的图表数据导出到新的 DataFrame:

  • 多引擎 DataFrame 支持:使用一个 API 即可直观呈现 pyspark.sql.DataFrame(包括 Spark Connect DataFrame)、bigframes.pandas.DataFrame 和 pandas.DataFrame 对象。
  • 内核内和分布式执行:虽然该 widget 会从 Google 的 CDN 加载数据洞察图表界面,但您的底层数据不会发送到数据洞察。所有聚合和过滤操作都在 Python 内核或 Managed Service for Apache Spark 会话中运行,图表则在笔记本客户端中本地呈现。
  • 零环境冲突:可选的分布式引擎(例如 pyspark 和 bigframes)会在运行时检测到,并且在您安装 google-colabsqlviz 时不会升级或覆盖。

准备工作

在无服务器运行时版本为 3.0 或更高版本的 Managed Service for Apache Spark 交互式会话中,支持通过 Spark Connect 使用 google-colabsqlviz 呈现 PySpark DataFrame。

请按照以下说明在 Visual Studio Code (VS Code) 中使用 Data Agent Kit 创建笔记本,或使用其他受支持的 Jupyter 笔记本环境,例如 JupyterLab:

  1. 设置和配置 Data Agent Kit (DAK):
    1. 安装 Data Agent Kit 扩展程序。
    2. 配置 Data Agent Kit。
    3. 确保您拥有所需的 Identity and Access Management (IAM) 角色。
  2. 创建笔记本:
    1. 在 VS Code 活动栏中,点击 Data Agent Kit,展开 Apache Spark,然后选择 + 新建 Spark 笔记本。
    2. 在选择内核类型部分,点击本地内核。
    3. 如需选择无服务器运行时模板,请点击列出的运行时模板的名称。
    4. 在笔记本工具栏中,点击选择内核,点击 Python 环境…,然后选择本地 Python 环境。
  3. 如需在本地环境中安装所需的 Spark Connect 和 google-colabsqlviz Python 软件包,请在笔记本单元或本地终端中运行以下命令:

    Notebook 单元

    %pip install -U 'google-cloud-spark-connect[interactive,client]'
    

    本地终端

    pip install -U 'google-cloud-spark-connect[interactive,client]'
    

加载并直观呈现数据集

启动 ManagedSparkSession 并将数据集加载到 pyspark.sql.DataFrame 后,将 DataFrame 传递给 explore_dataframe 函数以呈现交互式可视化。以下示例会连接到无服务器会话,并从 Lakehouse 公共数据集加载 Palmer Penguins 数据集 (`lakehouse-public-data`.ml_datasets.penguins):

# Importing managed_spark_connect automatically imports explore_dataframe
from google.cloud.managed_spark_connect import ManagedSparkSession

spark = (
    ManagedSparkSession.builder.projectId("PROJECT_ID")
    .location("REGION")
    .getOrCreate()
)

df = spark.read.table("`lakehouse-public-data`.ml_datasets.penguins")

explore_dataframe(df)

替换以下内容:

  • PROJECT_ID:您的 Google Cloud 项目 ID。
  • REGION:会话的 Managed Service for Apache Spark 区域(例如 us-central1)。

运行该单元时,google-colabsqlviz 会检查 DataFrame 架构,并在单元输出区域中呈现一个交互式可视化微件,其中包含默认可视化图表。对于 penguins 数据集,它会呈现一个散点图,显示按 species 分组的平均 flipper_length_mm 和 body_mass_g。

在 widget 工具栏中,点击数据,在分页表格中检查底层 DataFrame 行。选择拆分模式可同时查看图表和底层数据表。点击图表以返回图表视图。

可视化 widget 中的默认散点图视图,显示了按企鹅物种划分的平均鳍状肢长度和体重。

探索和自定义图表

您可以在 widget 界面中自定义图表类型、维度、指标、聚合、排序和过滤条件,并将生成的数据导出回笔记本中的 DataFrame。

  1. 选择图表类型:在配置设置面板中,点击图表类型菜单,然后选择一种图表类型,例如垂直条形图。如需查看受支持图表类型的完整列表,请参阅数据洞察中的图表类型。
  2. 配置维度和指标:在设置标签页中,为 penguins DataFrame 配置字段:
    • 将维度设置为 species,以便按企鹅物种对记录进行分组。
    • 在指标 - Y 轴下,将指标设置为 body_mass_g,并将聚合设置为 AVG(平均值),以计算每个物种的平均体重(以克为单位)。
    • 点击添加维度,然后选择 island 或 sex,以跨多个维度细分图表,或将指标汇总从 AVG 更改为 MAX 或 SUM。
  3. 对可视化图表进行排序和过滤:
    • 在设置标签页的排序下,选择 body_mass_g 并采用 AVG 聚合,然后选择降序,按平均体重从高到低对物种进行排名。
    • 点击微件工具栏中的添加过滤条件,按字段值(例如 body_mass_g 大于或等于 4000)过滤记录,或点击微件底部的创建输出数据帧,将汇总的图表数据或过滤后的数据导出到新的 DataFrame 单元格。当您更新图表属性或过滤条件时,google-colabsqlviz 会根据 DataFrame 重新计算查询并更新可视化图表:

可视化图表微件中的垂直条形图和配置面板,按降序显示企鹅物种的平均体重。

如需详细了解如何在嵌入式图表界面中配置图表属性、聚合和交互式控件,请参阅以下文档:

为大型 DataFrame 配置执行

将 pyspark.sql.DataFrame 传递给 explore_dataframe(df) 时,google-colabsqlviz 会根据 DataFrame 的大小在两种执行策略之间进行选择:

  • 内存中具体化(较小 DataFrame 的默认设置):如果 DataFrame 估计为 256 MiB 或更小,并且最多包含 5,000,000 行,则 google-colabsqlviz 会将 DataFrame 收集到内核内存中一次。后续图表类型更改、聚合、排序和过滤操作会在内存中运行,延迟极低,并且不会触发新的 Spark 作业。
  • 分布式 Spark 下推(适用于较大 DataFrame 的默认模式):如果 DataFrame 超出字节或行预算,google-colabsqlviz 会保持 DataFrame 的延迟执行状态,并将每个图表查询、过滤、排序和分页请求转换为在 Managed Service for Apache Spark 无服务器会话中执行的 PySpark 操作。此方法可能会增加额外的延迟时间,但可让您直观呈现更大的 DataFrame。

您可以在调用 explore_dataframe(df) 之前设置 COLABSQLVIZ_PYSPARK_EAGER_MAX_BYTES 环境变量,以调整或停用内存中具体化阈值:

import os

# Importing managed_spark_connect automatically imports explore_dataframe
from google.cloud.managed_spark_connect import ManagedSparkSession

# Set to "0" to disable upfront collection and push all chart queries to Spark,
# or set a custom byte limit, such as str(64 * 1024 * 1024) for 64 MiB.
os.environ["COLABSQLVIZ_PYSPARK_EAGER_MAX_BYTES"] = "0"

explore_dataframe(df)

后续步骤