访问使用 Delta Sharing 与你共享的数据

重要

Delta Sharing 目前为公共预览版。 要使用预览版,必须在 Azure Databricks 帐户控制台中启用外部数据共享功能组。 请参阅为帐户启用外部数据共享功能组

Delta Sharing 受适用条款约束。 启用外部数据共享功能组即表示接受这些条款。

本文介绍数据接收者如何使用 Databricks、Apache Spark 和 pandas 访问通过 Delta Sharing 共享的数据。

Delta Sharing 和数据接收者

Delta Sharing 是安全数据共享的开放标准。 Databricks 用户也称为“数据提供者”,可以使用 Delta Sharing 与其组织外部的人员或组(称为“数据接收者”)共享数据。 有关连接器的完整列表以及如何使用它们的信息,请参阅 Delta Sharing 文档。 本文介绍数据接收者如何使用 Databricks、Apache Spark 和 pandas 访问通过 Delta Sharing 共享的数据。

共享数据不由 Databricks 直接提供,而是由 Databricks 上运行的数据提供者提供。

注意

通过作为数据接收者访问数据提供者的共享数据,数据接收者表示其已被授权访问数据提供者提供给其的数据共享,并承认 (1) Databricks 对此类数据或数据接收者对此类共享数据的使用不承担任何责任,以及 (2) Databricks 可收集关于数据接收者使用和访问共享数据的信息(包括识别使用与此类信息相关的凭证文件访问数据的任何个人或公司),并可与适用的数据提供者共享。

下载凭据文件

若要授予你访问共享数据的权限,数据提供者会向你发送一个激活 URL,可在其中下载凭据文件。 本文介绍如何使用凭据文件访问共享数据。

重要

只能下载一次凭据文件。 如果在下载凭据文件后再次访问激活链接,则“下载凭据文件”按钮处于禁用状态。

  • 请勿进一步与组织外部的任何人共享激活链接或共享收到的凭据文件。
  • 如果在使用激活链接之前丢失了激活链接,请联系数据提供者。
  1. 单击数据提供者与你共享的激活链接。 激活页会在浏览器中打开。
  2. 单击“下载凭据文件”。

将凭据文件存储在安全位置中。 如果需要与组织中的某人共享它,Databricks 建议使用密码管理器。

读取共享数据

下载凭据文件后,代码将使用凭据文件向数据提供者的 Databricks 帐户进行身份验证,并读取数据提供者与你共享的数据。 访问将一直持续到提供者停止与你共享数据为止。 你可以准乎实时地获得对数据的更新。 可读取和复制共享数据,但不能修改源数据。

以下部分介绍如何使用 Databricks、Apache Spark 和 pandas 访问共享数据。 如果在访问共享数据时遇到问题,请联系数据提供者。

注意

除非另有说明,否则合作伙伴集成由第三方提供。你必须拥有相应提供者的帐户才能使用他们的产品和服务。 尽管 Databricks 尽量使此内容保持最新状态,但我们不会就合作伙伴集成页上的集成或内容准确性做出任何陈述。 有关集成的问题,请咨询相应的提供商。

使用 Databricks

按照以下步骤,使用笔记本命令访问 Azure Databricks 工作区中的共享数据。 将凭据文件存储在 DBFS 中,然后使用它向数据提供者的 Azure Databricks 帐户进行身份验证,并读取数据提供者与你共享的数据。

在此示例中,创建了一个笔记本,其中包含多个可独立运行的单元格。 可改为将笔记本命令添加到同一单元格,并按顺序运行它们。

  1. 在文本编辑器中,打开下载的凭据文件。

  2. 单击工作区图标“工作区”。

  3. 右键单击某个文件夹,然后单击“创建”>“笔记本”。

    • 输入名称。
    • 将笔记本的默认语言设置为 Python。 这是默认值。
    • 选择要附加到笔记本的群集。 选择运行 Databricks Runtime 8.4 或更高版本的群集或安装了 Apache Spark 连接器库的群集。 有关安装群集库的详细信息,请参阅
    • 单击“创建”。

    笔记本随即在笔记本编辑器中打开。

  4. 若要使用 Python 或 pandas 访问共享数据,请安装 delta-sharing Python 连接器。 在笔记本编辑器中,粘贴以下命令:

    %sh pip install delta-sharing
    
  5. 在最右侧的“单元格操作”菜单 单元格操作 中,单击 运行图标 并选择“运行单元格”,或者按 Shift+Enter。

    delta-sharing Python 库将安装在群集中(如果尚未安装)。

  6. 在笔记本编辑器中,单击 向下的脱字号,然后选择“在下方添加单元格”。 在新的单元格中,粘贴以下命令,该命令将凭据文件的内容上传到 DBFS 的一个文件夹中。 替换变量,如下所示:

    • <dbfs-path>:要保存凭据文件的文件夹的路径

    • <credential-file-contents>:凭据文件的内容。

      凭据文件包含定义三个字段的 JSON:shareCredentialsVersionendpointbearerToken

      %scala
      dbutils.fs.put("<dbfs-path>/config.share","""
      <credential-file-contents>
      """)
      
  7. 在最右侧的“单元格操作”菜单 单元格操作 中,单击 运行图标 并选择“运行单元格”,或者按 Shift+Enter。

    上传凭据文件后,可删除此单元格。 所有工作区用户都可以从 DBFS 读取凭据文件,并且凭据文件在 DBFS 的所有群集和 SQL 仓库上都可用。 若要删除单元格,请单击最右侧单元格操作菜单 单元格操作 中的“x”。

  8. 使用 Python 列出共享中的表。 在笔记本编辑器中,单击 向下的脱字号,然后选择“在下方添加单元格”。

  9. 在新的单元格中,粘贴以下命令。 将 <dbfs-path> 替换为上一命令中的路径。

    代码运行时,Python 从 DBFS 的群集上读取凭据文件。 使用 FUSE 在 /dbfs/ 装载 DBFS。

    import delta_sharing
    
    client = delta_sharing.SharingClient(f"/dbfs/<dbfs-path>/config.share")
    
    client.list_all_tables()
    
  10. 在最右侧的“单元格操作”菜单 单元格操作 中,单击 运行图标 并选择“运行单元格”,或者按 Shift+Enter。

    结果是一个表数组,以及每个表的元数据。 以下输出显示了两个表:

    Out[10]: [Table(name='example_table', share='example_share_0', schema='default'), Table(name='other_example_table', share='example_share_0', schema='default')]
    

    如果输出为空或不包含预期表,请与数据提供者联系。

  11. 使用 Scala 查询共享表。 在笔记本编辑器中,单击 向下的脱字号,然后选择“在下方添加单元格”。 在新的单元格中,粘贴以下命令。 代码运行时,通过 JVM 从 DBFS 读取凭据文件。

    替换变量:

    • <profile_path>:凭据文件的 DBFS 路径。 例如 /<dbfs-path>/config.share
    • <share_name>:表的 share= 的值。
    • <schema_name>:表的 schema= 的值。
    • <table_name>:表的 name= 的值。
    %scala
     spark.read.format("deltaSharing")
       .load("<profile_path>#<share_name>.<schema_name>.<table_name>").limit(10);
    
  12. 在最右侧的“单元格操作”菜单 单元格操作 中,单击 运行图标 并选择“运行单元格”,或者按 Shift+Enter。

    每次加载共享表时,你都会看到来自源的新数据。

  13. 若要使用 SQL 查询共享数据,必须先从共享表在工作区中创建本地表,然后查询本地表。

    共享数据不存储或缓存在本地表中。 每次查询本地表时,你都会看到共享数据的当前状态。

    在笔记本编辑器中,单击 向下的脱字号,然后选择“在下方添加单元格”。 在新的单元格中,粘贴以下命令。

    替换变量:

    • <local_table_name>:本地表的名称。
    • <profile_path>:凭据文件的位置。
    • <share_name>:表的 share= 的值。
    • <schema_name>:表的 schema= 的值。
    • <table_name>:表的 name= 的值。
    %sql
    DROP TABLE IF EXISTS table_name;
    
    CREATE TABLE <local_table_name> USING deltaSharing LOCATION "<profile_path>#<share_name>.<schema_name>.<table_name>";
    
    SELECT * FROM <local_table_name> LIMIT 10;
    
  14. 在最右侧的“单元格操作”菜单 单元格操作 中,单击 运行图标 并选择“运行单元格”,或者按 Shift+Enter。

    运行该命令时,将直接查询共享数据。 作为测试,查询该表并返回前 10 个结果。

如果输出为空或不包含预期数据,请与数据提供者联系。

审核 Delta Sharing 资源的访问和活动

配置诊断日志记录后,Delta Sharing 会保存活动的审核日志,例如某人何时创建、修改、更新或删除共享或接收者,接收者何时访问激活链接并下载凭据,或者接收者的凭据何时轮换或过期。 Delta Sharing 活动在帐户级别记录。

  1. 为帐户启用诊断日志

    重要

    Delta Sharing 活动在帐户级别记录。 请勿在 workspace_ids_filter 中输入值。

    审核日志针对帐户的每个工作区以及帐户级活动提供。 日志将传送到配置的存储容器。

  2. Delta Sharing 事件在 serviceName 设置为 unityCatalog 的情况下记录。 每个事件的 requestParams 部分包含以下字段,你可与数据提供者共享这些字段以帮助他们排查问题。

    • recipient_name:数据提供者系统中接收者的名称。
    • metastore_id:数据提供者系统中元存储的名称。
    • sourceIPAddress:发起请求的 IP 地址。

    例如,以下审核事件显示接收者已成功列出可供他们使用共享。 在本示例中,修订后的值替换为 <redacted>

    {
     "Version":"2.0",
     "auditLevel":"ACCOUNT_LEVEL",
     "Timestamp":1635235341950,
     "orgId":"0",
     "shardName":"<redacted>",
     "accountId":"<redacted>",
     "sourceIPAddress":"<redacted>",
     "userAgent":null,
     "sessionId":null,
     "userIdentity":null,
     "serviceName":"unityCatalog",
     "actionName":"deltaSharingListShares",
     "requestId":"ServiceMain-cddd3114b1b40003",
     "requestParams":{
       "Metastore_id":"<redacted>",
       "Options":"{}",
       "Recipient_name":"<redacted>"
       },
     "Response":{
       "statusCode":200,
       "errorMessage":null,
       "Result":null
     },
     "MAX_LOG_MESSAGE_LENGTH":16384
    }
    

下表从数据接收者的角度列出了 Delta Sharing 的审核事件。

action requestParams
deltaSharingListShares options:此请求提供的分页选项。
deltaSharingListSchemas share:共享的名称。

options:此请求提供的分页选项。
deltaSharingListTables share:共享的名称。

options:此请求提供的分页选项。
deltaSharingListAllTables share:共享的名称。
deltaSharingGetTableVersion share:共享的名称。

schema:架构的名称。

name:表的名称。
deltaSharingGetTableMetadata share:共享的名称。

schema:架构的名称。

name:表的名称。

predicateHints:查询中包含的谓词。

limitHints:返回的最大行数。

从数据接收者的角度来看,记录以下 Delta Sharing 错误。 <> 字符之间的项表示占位符文本。

  • 用户试图访问他们无权访问的共享。

    DatabricksServiceException: PERMISSION_DENIED:
    User does not have SELECT on Share <share_name>`
    
  • 用户试图访问不存在的共享。

    DatabricksServiceException: SHARE_DOES_NOT_EXIST: Share <share_name> does not exist.
    
  • 用户试图访问共享中不存在的表。

    DatabricksServiceException: TABLE_DOES_NOT_EXIST: <table_name> does not exist.
    

有关数据提供者的可审核事件和错误,请参阅审核 Delta Sharing 资源的访问和活动

在 Azure Databricks 外访问共享数据

如果不使用 Azure Databricks,请按照这些说明访问共享数据。

使用 Apache Spark

按照以下步骤在 Apache Spark 3.x 或更高版本中访问共享数据。

  1. 若要访问与共享数据相关的元数据(例如与你共享的表列表),请安装 delta-sharing Python 连接器

    pip install delta-sharing
    
  2. 安装 Apache Spark 连接器

  3. 列出共享中的表。 在下面的示例中,将 <profile_path> 替换为凭据文件的位置。

     import delta_sharing
    
     client = delta_sharing.SharingClient(f"<profile_path>/config.share")
    
     client.list_all_tables()
    

    结果是一个表数组,以及每个表的元数据。 以下输出显示了两个表:

     Out[10]: [Table(name='example_table', share='example_share_0', schema='default'), Table(name='other_example_table', share='example_share_0', schema='default')]
    

    如果输出为空或不包含预期表,请与数据提供者联系。

  4. 使用 Python 在 Spark 中访问共享数据:

    delta_sharing.load_as_spark(f"<profile_path>#<share_name>.<schema_name>.<table_name>")
    
    spark.read.format("deltaSharing")\
    .load("<profile_path>#<share_name>.<schema_name>.<table_name>")\
    .limit(10))
    

    替换变量,如下所示:

    • <profile_path>:凭据文件的位置。
    • <share_name>:表的 share= 的值。
    • <schema_name>:表的 schema= 的值。
    • <table_name>:表的 name= 的值。
  5. 使用 Scala 在 Apache Spark 中访问共享数据:

    spark.read.format("deltaSharing")
    .load("<profile_path>#<share_name>.<schema_name>.<table_name>")
    .limit(10)
    

    替换变量,如下所示:

    • <profile_path>:凭据文件的位置。
    • <share_name>:表的 share= 的值。
    • <schema_name>:表的 schema= 的值。
    • <table_name>:表的 name= 的值。

如果输出为空或不包含预期数据,请与数据提供者联系。

使用 pandas

按照以下步骤在 pandas 0.25.3 或更高版本中访问共享数据。

  1. 若要访问与共享数据相关的元数据(例如与你共享的表列表),必须安装 delta-sharing Python 连接器

    pip install delta-sharing
    
  2. 列出共享中的表。 在下面的示例中,将 <profile_path> 替换为凭据文件的位置。

     import delta_sharing
    
     client = delta_sharing.SharingClient(f"<profile_path>/config.share")
    
     client.list_all_tables()
    

    如果输出为空或不包含预期表,请与数据提供者联系。

  3. 使用 Python 在 pandas 中访问共享数据。 在下面的示例中,按如下所示替换变量:

    • <profile_path>:凭据文件的位置。
    • <share_name>:表的 share= 的值。
    • <schema_name>:表的 schema= 的值。
    • <table_name>:表的 name= 的值。
    import delta_sharing
    delta_sharing.load_as_pandas(f"<profile_path>#<share_name>.<schema_name>.<table_name>")
    

如果输出为空或不包含预期数据,请与数据提供者联系。

后续步骤