此页面包含两个世系系统表的参考。 这些系统表基于 Unity 目录 的数据世系功能构建,使你能够以编程方式查询世系数据来推动决策和报告。 若要访问表,必须在目录中启用 system 架构。 有关详细信息,请参阅 “启用系统表”。
Note
这两个世系表呈现的都是所有读/写事件的子集,因为世系并不一定可以捕获。 仅当可以推断世系时,才会发出记录。 世系限制中描述的数据世系限制也适用于世系系统表。
表世系表
表世系系统表包括 Unity Catalog 表或路径上每个读取或写入事件的记录。 这包括但不限于作业运行、笔记本运行以及使用读取或写入事件更新的仪表板。
表路径:此系统表位于 system.access.table_lineage。
表世系架构
表世系系统表使用以下架构。
| 列名称 | 数据类型 | Description | Example |
|---|---|---|---|
account_id |
字符串 | Azure Databricks 帐户的 ID。 | 7af234db-66d7-4db3-bbf0-956098224879 |
metastore_id |
字符串 | Unity Catalog 元存储的 ID。 | 5a31ba44-bbf4-4174-bf33-e1fa078e6765 |
workspace_id |
字符串 | 工作区的 ID | 123456789012345 |
entity_type |
字符串 | 与世系记录关联的实体类型(如果有)。 值为 NOTEBOOK、、JOB、PIPELINE、 DASHBOARD_V3DBSQL_DASHBOARD (旧仪表板)DBSQL_QUERY或 NULL。注意:有关世系记录中涉及的所有实体的信息,请参阅 entity_metadata 列。 |
JOB |
entity_id |
字符串 | 与世系记录关联的实体的 ID,或 NULL。 注意:有关世系记录中涉及的所有实体的信息,请参阅 entity_metadata 列。 |
417306252667357 |
entity_run_id |
字符串 | 与世系记录关联的实体的唯一运行 ID,或 NULL。 注意:有关世系记录中涉及的所有实体的信息,请参阅 entity_metadata 列。 |
688612062233399 |
source_table_full_name |
字符串 | 用于标识源表的三部分名称。 | catalog.schema.table |
source_table_catalog |
字符串 | 源表的目录。 | catalog |
source_table_schema |
字符串 | 源表的架构。 | schema |
source_table_name |
字符串 | 源表的名称。 | table |
source_path |
字符串 | 源表在云存储中的位置;如果直接从云存储读取,则为路径。 | abfss://my-container-name@storage-account-name.dfs.core.windows.net/table1 |
source_type |
字符串 | 源的类型。 值为TABLE、、PATH、VIEW、MATERIALIZED_VIEWMETRIC_VIEW或STREAMING_TABLE。 |
TABLE |
target_table_full_name |
字符串 | 用于标识目标表的三部分名称。 | catalog.schema.table |
target_table_catalog |
字符串 | 目标表的目录。 | catalog |
target_table_schema |
字符串 | 目标表的架构。 | schema |
target_table_name |
字符串 | 目标表的名称。 | table |
target_path |
字符串 | 目标表在云存储中的位置。 | abfss://my-container-name@storage-account-name.dfs.core.windows.net/table1 |
target_type |
字符串 | 目标的类型。 值为TABLE、、PATH、VIEW、MATERIALIZED_VIEWMETRIC_VIEW或STREAMING_TABLE。 |
TABLE |
created_by |
字符串 | 生成此世系的用户。 这可以是 Azure Databricks 用户名、Azure Databricks 服务主体 ID“System-User”,也可以是 NULL(如果无法捕获用户信息)。 |
crampton.rods@email.com |
event_time |
时间戳 | 生成世系的时间戳。 时区信息记录在值的末尾,其中 +00:00 表示 UTC。 |
2025-04-20T19:47:21.194+00:00 |
event_date |
date | 生成世系的日期。 这是一个分区列。 | 2025-04-20 |
record_id |
字符串 | 世系记录的唯一标识符。 此值是自动生成的,不能与任何表联接。 | 3c5c8eed-87bb-3aa6-8a86-80d00d48299e |
event_id |
字符串 | 单个世系事件的唯一 ID。 多个行可能会共享相同的 event_id,如果它们是由同一事件生成的。 此值是自动生成的,不能与任何表联接。 |
ca123ff3-f3f8-332b-a832-0154a6327353 |
statement_id |
字符串 | 生成世系事件的查询语句的唯一 ID。 这是与 查询历史记录系统表联接的外键。 仅当从 SQL 仓库运行查询时,才会设置此值。 | 1234526f-a6ac-475c-8601-e8637f8ee039 |
entity_metadata |
结构 | 有关负责世系事件的实体的元数据。 | 请参阅 实体元数据 |
列世系表
列世系表不包括没有源的事件。 例如,如果使用显式值向列中插入数据,则该事件不会被捕获。 如果读取列,则无论是否写入输出,该事件都会被捕获。
表路径:此系统表位于 system.access.column_lineage。
列世系架构
列世系系统表使用以下架构:
| 列名称 | 数据类型 | Description | Example |
|---|---|---|---|
account_id |
字符串 | Azure Databricks 帐户的 ID。 | 7af234db-66d7-4db3-bbf0-956098224879 |
metastore_id |
字符串 | Unity Catalog 元存储的 ID。 | 5a31ba44-bbf4-4174-bf33-e1fa078e6765 |
workspace_id |
字符串 | 工作区的 ID | 123456789012345 |
entity_type |
字符串 | 与世系记录关联的实体类型(如果有)。 值为 NOTEBOOK、、JOB、PIPELINE、 DASHBOARD_V3DBSQL_DASHBOARD (旧仪表板)DBSQL_QUERY或 NULL。注意:有关世系记录中涉及的所有实体的信息,请参阅 entity_metadata 列。 |
JOB |
entity_id |
字符串 | 与世系记录关联的实体的 ID,或 NULL。 注意:有关世系记录中涉及的所有实体的信息,请参阅 entity_metadata 列。 |
417306252667357 |
entity_run_id |
字符串 | 与世系记录关联的实体的唯一运行 ID,或 NULL。 注意:有关世系记录中涉及的所有实体的信息,请参阅 entity_metadata 列。 |
688612062233399 |
source_table_full_name |
字符串 | 用于标识源表的三部分名称。 | catalog.schema.table |
source_table_catalog |
字符串 | 源表的目录。 | catalog |
source_table_schema |
字符串 | 源表的架构。 | schema |
source_table_name |
字符串 | 源表的名称。 | table |
source_path |
字符串 | 源表在云存储中的位置;如果直接从云存储读取,则为路径。 | abfss://my-container-name@storage-account-name.dfs.core.windows.net/table1 |
source_type |
字符串 | 源的类型。 值为TABLE、、PATH、VIEW、MATERIALIZED_VIEWMETRIC_VIEW或STREAMING_TABLE。 |
TABLE |
source_column_name |
字符串 | 源列的名称。 | date |
target_table_full_name |
字符串 | 用于标识目标表的三部分名称。 | catalog.schema.table |
target_table_catalog |
字符串 | 目标表的目录。 | catalog |
target_table_schema |
字符串 | 目标表的架构。 | schema |
target_table_name |
字符串 | 目标表的名称。 | table |
target_path |
字符串 | 目标表在云存储中的位置。 | abfss://my-container-name@storage-account-name.dfs.core.windows.net/table1 |
target_type |
字符串 | 目标的类型。 值为TABLE、、PATH、VIEW、MATERIALIZED_VIEWMETRIC_VIEW或STREAMING_TABLE。 |
TABLE |
target_column_name |
字符串 | 目标列的名称。 | date |
created_by |
字符串 | 生成此世系的用户。 这可以是 Azure Databricks 用户名、Azure Databricks 服务主体 ID“System-User”,也可以是 NULL(如果无法捕获用户信息)。 |
crampton.rods@email.com |
event_time |
时间戳 | 生成世系的时间戳。 时区信息记录在值的末尾,其中 +00:00 表示 UTC。 |
2025-04-20T19:47:21.194+00:00 |
event_date |
date | 生成世系的日期。 这是一个分区列。 | 2025-04-20 |
record_id |
字符串 | 世系记录的唯一标识符。 此值是自动生成的,不能与任何表联接。 | 3c5c8eed-87bb-3aa6-8a86-80d00d48299e |
event_id |
字符串 | 单个世系事件的唯一 ID。 多个行可能会共享相同的 event_id,如果它们是由同一事件生成的。 此值是自动生成的,不能与任何表联接。 |
ca123ff3-f3f8-332b-a832-0154a6327353 |
statement_id |
字符串 | 生成世系事件的查询语句的唯一 ID。 这是与 查询历史记录系统表联接的外键。 仅当从 SQL 仓库运行查询时,才会设置此值。 | 1234526f-a6ac-475c-8601-e8637f8ee039 |
entity_metadata |
结构 | 有关负责世系事件的实体的元数据。 | 请参阅 实体元数据 |
读取世系系统表
- 若要确定事件是读取还是写入,可以查看源类型和目标类型。
- 只读:源类型不为 null,但目标类型为 null。
- 只写:目标类型不为 null,但源类型为 null。
- 读取和写入:源类型和目标类型均不为 null。
实体元数据参考
该 entity_metadata 结构具有以下架构:
job_info:
job_id: "string"
job_run_id: "string"
dashboard_id: "string"
legacy_dashboard_id: "string"
notebook_id: "string"
sql_query_id: "string"
dlt_pipeline_info:
dlt_pipeline_id: "string"
dlt_update_id: "string"
Azure Databricks 记录 Lakeflow Spark 声明性管道、笔记本、作业、Databricks SQL 查询和仪表板中的世系事件。 不支持来自其他实体的事件。
可以根据事件类型填充多个值。 例如,运行笔记本任务的作业将同时填充 job_info 和 notebook_id。
如果所有 entity_metadata 值都 null位于其中,则表示事件中未涉及 Azure Databricks 实体。 例如,它可能是 JDBC 查询或用户单击 Azure Databricks UI 中的“示例数据”选项卡的结果。
世系系统表示例
为了举例说明如何在系统表中记录世系,下面提供了一个示例查询,后跟查询创建的世系记录:
CREATE OR REPLACE TABLE car_features
AS SELECT *, in1+in2 as premium_feature_set
FROM car_features_exterior
JOIN car_features_interior
USING(id, model);
system.access.table_lineage 中的记录如下所示:
entity_type |
entity_id |
source_table_name |
target_table_name |
created_by |
event_time |
|---|---|---|---|---|---|
NOTEBOOK |
27080565267 |
car_features_exterior |
car_features |
crampton@email.com |
2023-01-25T16:19:58.908+0000 |
NOTEBOOK |
27080565267 |
car_features_interior |
car_features |
crampton@email.com |
2023-01-25T16:19:58.908+0000 |
system.access.column_lineage 中的记录如下所示:
entity_type |
entity_id |
source_table_name |
target_table_name |
source_column_name |
target_column_name |
event_time |
|---|---|---|---|---|---|---|
NOTEBOOK |
27080565267 |
car_features_interior |
car_features |
in1 |
premium_feature_set |
2023-01-25T16:19:58.908+0000 |
NOTEBOOK |
27080565267 |
car_features_interior |
car_features |
in2 |
premium_feature_set |
2023-01-25T16:19:58.908+0000 |
Note
上面的示例中并未显示所有世系列。 有关完整架构,请参阅上面的世系架构。
使用表世系表分析表的受欢迎程度
表世系系统表可用于估计表的受欢迎程度。 例如,以下代码片段检索过去 7 天内最常查询的 100 个表:
SELECT
source_table_full_name,
COUNT(distinct event_id) AS num_of_queries
FROM
system.access.table_lineage t
WHERE
t.event_date > CURRENT_DATE() - INTERVAL 7 DAYS
AND t.source_table_full_name IS NOT NULL
GROUP BY source_table_full_name
ORDER BY num_of_queries DESC
LIMIT 100;
可以与 查询历史记录系统表 联接,以获取有关 SQL 仓库或无服务器计算上运行的查询的其他详细信息,包括缓存中提供的查询(请注意世系系统表不会发出缓存查询结果的条目)。 例如,以下代码片段检索过去 7 天内查询超过一小时的执行时间的表:
SELECT
t.source_table_full_name,
COUNT(distinct event_id) AS num_of_queries_over_hour
FROM
system.query.history h
INNER JOIN system.access.table_lineage t
ON t.statement_id = h.cache_origin_statement_id
WHERE
h.total_duration_ms > 3600000
AND t.event_date > CURRENT_DATE() - INTERVAL 7 DAYS
AND t.source_table_full_name IS NOT NULL
GROUP BY t.source_table_full_name
ORDER BY num_of_queries_over_hour DESC;
排查外部表查询问题
使用外部表的云存储路径引用外部表时,关联的世系记录仅包括路径名称,而不包括表名。 例如,此查询的世系记录将包括路径名称,而不是表名:
SELECT * FROM delta.`abfss://my-container-name@storage-account-name.dfs.core.windows.net/table1`;
如果尝试通过路径引用查询外部表的沿袭记录,则必须使用source_path或target_path来代替source_table_full_name或target_table_full_name进行筛选查询。 例如,以下查询可拉取外部表的所有世系记录:
SELECT *
FROM system.access.table_lineage
WHERE
source_path = "abfss://my-container-name@storage-account-name.dfs.core.windows.net/table1" OR
target_path = "abfss://my-container-name@storage-account-name.dfs.core.windows.net/table1";
基于外部表名称检索世系记录
如果不想手动检索云存储路径以查找世系,可以使用以下函数来使用表名称获取世系数据。 如果要查询列世系,还可以在函数中将 system.access.table_lineage 替换为 system.access.column_lineage。
def getLineageForTable(table_name):
table_path = spark.sql(f"describe detail {table_name}").select("location").head()[0]
df = spark.read.table("system.access.table_lineage")
return df.where(
(df.source_table_full_name == table_name)
| (df.target_table_full_name == table_name)
| (df.source_path == table_path)
| (df.target_path == table_path)
)
然后使用以下命令调用函数并显示外部表的世系记录:
display(getLineageForTable("table_name"))