从语义模型读取数据并使用 Spark 编写 Power BI 可使用的数据

本文介绍如何使用 Microsoft Fabric 中的语义链接 Spark 本机连接器读取数据和元数据,并评估语义模型中的度量值。 你还将了解如何编写语义模型可使用的数据。

先决条件

  • 转到 Microsoft Fabric 中的数据科学体验。

    • 在左窗格中,选择 工作负载
    • 选择 数据科学
  • 创建新的笔记本,将代码复制/粘贴到单元格中。

  • 对于 Spark 3.4 及以上版本,使用 Fabric 时,语义链接在默认运行时中可用,无需安装它。 如果使用 Spark 3.3 或更低版本,或者想要更新到最新版本的语义链接,可以运行以下命令:

    python %pip install -U semantic-link

  • 将 Lakehouse 添加到笔记本

  • 从 fabric-samples 存储库的数据集文件夹中下载 Customer Profitability Sample.pbix 语义模型,将语义模型保存在本地。

将语义模型上传到工作区

在本文中,我们将使用“Customer Profitability Sample.pbix”语义模型。 此语义模型引用公司制造营销材料,并包含有关各个业务部门的产品、客户和相应收入的数据。

  1. 在左窗格中,选择 工作区,然后选择 工作区的名称 将其打开。
  2. 选择“导入”“报表或分页报表”>“从此计算机”,然后选择“客户盈利率示例.pbix”语义模型>

屏幕截图显示用于将语义模型上传到工作区的界面。

上传完成后,工作区将有三个新项目:Power BI 报表、仪表板和名为“客户盈利率示例”的语义模型。 使用此语义模型完成本文中的步骤。

屏幕截图显示上传到工作区的 Power BI 文件中的项。

在 Python、R、SQL 和 Scala 中使用 Spark 读取和写入数据

默认情况下,用于访问语义模型的工作区是:

  • 附加湖屋的工作区,或者
  • 笔记本的工作区(如果附加了湖屋)。

Microsoft Fabric 以 Spark 表的形式公开工作区中所有语义模型中的所有表。 所有 Spark SQL 命令都可以在 Python、R 和 Scala 中执行。 语义链接 Spark 本机连接器支持将 Spark 谓词向下推送到 Power BI 引擎。

提示

由于 Power BI 表和度量值公开为常规 Spark 表,因此可以在单个查询中与其他 Spark 数据源联接它们。

  1. 使用 PySpark 列出工作区中所有语义模型的表。

    df = spark.sql("SHOW TABLES FROM pbi")
    display(df)
    
  2. 使用 SparkR,从“Customer Profitability Sample”语义模型中的“”表中检索数据

    注意

    检索表受到严格的限制(请参阅读取限制),结果可能不完整。 使用聚合下推减少传输的数据量。 支持的聚合包括:COUNT、SUM、AVG、MIN 和 MAX。

    %%sparkr
    
    df = sql("SELECT * FROM pbi.`Customer Profitability Sample`.Customer")
    display(df)
    
  3. Power BI 度量值可通过虚拟表“_Metrics”获取。 以下查询按区域行业计算总收入利润预算

    %%sql
    
    SELECT
        `Customer[Country/Region]`,
        `Industry[Industry]`,
        AVG(`Total Revenue`),
        AVG(`Revenue Budget`)
    FROM
        pbi.`Customer Profitability Sample`.`_Metrics`
    WHERE
        `Customer[State]` in ('CA', 'WA')
    GROUP BY
        `Customer[Country/Region]`,
        `Industry[Industry]`
    
  4. 使用 Spark 架构检查可用的度量值和维度。

    spark.table("pbi.`Customer Profitability Sample`._Metrics").printSchema()
    
  5. 将数据保存为 Lakehouse 的增量表。

    delta_table_path = "<your delta table path>" #fill in your delta table path 
    df.write.format("delta").mode("overwrite").save(delta_table_path)
    

读取访问限制

读取访问 API 具有以下限制:

  • 分析服务不支持运行时间超过 10 秒的查询(Spark 中的指示:“java.net.SocketTimeoutException:PowerBI 服务通信失败”)
  • 使用 Spark SQL 的 Power BI 表访问受 Power BI 后端限制的约束。
  • Spark _Metrics 查询的谓词下推仅限于单个 IN 表达式,要求至少有两个元素。 数据传输后,Spark 中会计算额外的 IN 表达式和不受支持的谓词。
  • 使用 Spark SQL 访问的 Power BI 表的谓词下推不支持以下表达式:
  • 必须重启 Spark 会话,才能在 Spark SQL 中访问新的语义模型。