适用于:
Databricks SQL
重要
此功能目前以公共预览版提供。
本页介绍如何对 SQL 仓库计算使用临时表进行会话范围的中间数据存储和分析。
临时表在 Azure Databricks 会话期间存储数据。 使用临时表将中间结果具体化为探索分析或 SQL 数据管道,而无需在目录中创建永久表。
临时表仅适用于 SQL 仓库计算。 尚不支持经典计算和无服务器计算。
何时使用临时表
如果需要在探索分析或工作流开发期间存储生存期较短的中间数据、在同一会话中跨多个作重复使用查询结果,或者使用类似表的接口,而无需将对象添加到目录命名空间,请使用临时表。
如果数据需要保留到当前会话之外,或者必须与其他用户或作业共享,请改用永久的 Unity 目录表。 请参阅 Azure Databricks for Delta Lake 和 Apache Iceberg 中的 Unity 目录托管表。
创建临时表
使用 CREATE TEMPORARY TABLE 或 CREATE TEMP TABLE 语法创建临时表。 可以使用定义的架构创建空表,也可以从查询结果创建表。
-- Create an empty temporary table with a defined schema
CREATE TEMPORARY TABLE temp_customers (
id INT,
name STRING,
email STRING
);
-- Create a temporary table from query results
CREATE TEMP TABLE temp_recent_orders AS
SELECT order_id, customer_id, order_date, amount
FROM prod.sales.orders
WHERE order_date >= current_date() - INTERVAL 30 DAYS;
-- Create a temporary table using VALUES clause
CREATE TEMP TABLE temp_test_data AS
VALUES
(9001, 101, 50.00),
(9002, 204, 75.00),
(9003, 101, 25.00)
AS t(order_id, customer_id, amount);
注释
-
CREATE OR REPLACE TEMP TABLE尚不支持这种语法。 若要替换临时表,请先将其删除,然后重新创建它。 - 创建临时表时不要指定
USING子句。 临时表默认使用 Delta 格式,并显式指定格式会导致错误。
查询临时表
引用临时表时使用单部分名称。 不要指定目录或架构。
-- Query a temporary table
SELECT * FROM temp_customers;
-- Join temporary tables with permanent tables
SELECT
c.name,
o.order_id,
o.amount
FROM temp_customers c
INNER JOIN temp_recent_orders o
ON c.id = o.customer_id;
引用具有单部分名称的表时,Azure Databricks 按以下顺序搜索:
- 当前会话中的临时表
- 当前架构中的永久表
在会话中,如果创建了与现有永久表同名的临时表,则临时表将具有优先权。 若要显式引用与临时表同名的永久表,请使用完全限定的三部分名称:
-- References temporary table (if it exists)
SELECT * FROM customers;
-- Explicitly references permanent table
SELECT * FROM prod.sales.customers;
有关 Azure Databricks 中的名称解析的详细信息,请参阅 名称解析。
修改临时表
可以使用标准的 DML 操作将数据插入、更新和合并到临时表中。
-- Insert data into a temporary table
INSERT INTO temp_customers VALUES (101, 'Jane Doe', 'jane@example.com');
-- Insert from a query
INSERT INTO temp_customers
SELECT id, name, email
FROM prod.customer.active_customers
WHERE region = 'US-WEST';
-- Update rows in a temporary table
UPDATE temp_recent_orders
SET amount = amount * 0.90
WHERE customer_id = 101;
-- Merge data into a temporary table
MERGE INTO temp_customers target
USING prod.customer.new_signups source
ON target.id = source.id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;
注释
DELETE FROM 临时表尚不支持操作。 请使用 MERGE INTO 与筛选条件,或者改用筛选后的数据重新创建表。
删除临时表
Azure Databricks 会在会话结束时自动删除临时表,但如果不再需要临时表,可以显式删除它们。
-- Drop a temporary table
DROP TEMP TABLE temp_customers;
-- Drop only if it exists
DROP TEMP TABLE IF EXISTS temp_recent_orders;
生命周期和时间限制
临时表仅在创建临时表的 Azure Databricks 会话中存在。 自会话创建起最长生存期为七天。 当会话结束或七天后(以第一个为准)时,临时表将变得不可访问。 这些限制适用于笔记本、SQL 编辑器、作业和 JDBC/ODBC 会话。
存储和清理
Azure Databricks 自动管理临时表存储。 数据保留在云存储中,类似于 Unity 目录托管表。 当临时表变得不可访问(会话结束或达到七天限制时),无法再查询数据。 Azure Databricks 通常会在后台在几天内自动回收存储。 即便断开连接或群集意外关闭,清理都会自动进行。
隔离和特权
任何用户可以创建临时表。 您不需要在 Unity Catalog 中的目录或架构上拥有特权。
临时表提供会话级隔离。 每个临时表仅存在于创建它的会话中。 其他用户无法读取、修改或检测临时表是否存在。
可以创建与现有永久表同名的临时表,而不会发生冲突。 有关 Azure Databricks 如何解析表名称的详细信息,请参阅 查询临时表。
临时表与临时视图共享命名空间。 不能在同一会话中创建具有相同名称的临时表和临时视图。
局限性
临时表具有以下限制:
-
架构修改:
ALTER TABLE不支持操作。 若要修改临时表的架构,请删除并重新创建该表。 - 克隆:不支持浅表和深度克隆。
- 时间旅行:不支持时间旅行查询。
-
流式处理:不能在流式查询中使用临时表(例如,在
foreachBatch操作中)。 - API 支持:仅支持 SQL API。 不支持数据帧 API。
- 笔记本多用户访问:只有一个用户可以与笔记本会话中的临时表进行交互。 第二个用户不能在同一会话中读取、写入或创建临时表。