SESSION_CONFIGS

功能概述

读取当前会话的配置参数。有两种调用形式:无参数形式返回服务端注入的所有

cz.sql.*
cz.sql.*
配置项(
MAP<STRING, STRING>
MAP<STRING, STRING>
),带参数形式读取指定 key 的单个值(
STRING
STRING
)。

CURRENT_SETTING
CURRENT_SETTING
SESSION_CONFIGS 的别名,两个名称完全等价。

语法

-- 返回服务端注入的会话配置(MAP 类型) SESSION_CONFIGS() -- 读取单个配置项的值 SESSION_CONFIGS('<key>') CURRENT_SETTING('<key>') -- 等价写法

参数与返回值

调用形式返回类型key 不存在时
SESSION_CONFIGS()
SESSION_CONFIGS()
MAP<STRING, STRING>
MAP<STRING, STRING>
SESSION_CONFIGS('key')
SESSION_CONFIGS('key')
STRING
STRING
返回空字符串
""
""
CURRENT_SETTING('key')
CURRENT_SETTING('key')
STRING
STRING
返回空字符串
""
""
SESSION_CONFIGS()['key']
SESSION_CONFIGS()['key']
STRING
STRING
返回
NULL
NULL

使用示例

读取单个配置项

-- 读取当前时区(推荐用 CURRENT_SETTING) SELECT CURRENT_SETTING('cz.sql.timezone'); -- 返回: 'Asia/Shanghai' -- key 不存在时返回空字符串,不是 NULL SELECT CURRENT_SETTING('no.such.key'); -- 返回: '' SELECT CURRENT_SETTING('no.such.key') IS NULL; -- 返回: false

读取用户定义的 cz.sql.* 参数

通过

SET
SET
在当前 SQL 中定义
cz.sql.*
cz.sql.*
参数后,可用
SESSION_CONFIGS()['key']
SESSION_CONFIGS()['key']
CURRENT_SETTING('key')
CURRENT_SETTING('key')
读取:

SET cz.sql.bizdate = '2024-01-01'; SET cz.sql.region = 'east'; SELECT SESSION_CONFIGS()['cz.sql.bizdate']; -- 返回: '2024-01-01' SELECT SESSION_CONFIGS()['cz.sql.region']; -- 返回: 'east' SELECT CURRENT_SETTING('cz.sql.bizdate'); -- 返回: '2024-01-01'

在查询中直接引用参数,适用于普通 SQL(非动态表):

SET cz.sql.start_date = '2024-01-01'; SET cz.sql.end_date = '2024-01-31'; SELECT * FROM orders WHERE order_date BETWEEN SESSION_CONFIGS()['cz.sql.start_date'] AND SESSION_CONFIGS()['cz.sql.end_date'];

需要非字符串类型时显式转换:

SET cz.sql.top_n = '10'; SELECT * FROM products ORDER BY sales DESC LIMIT CAST(SESSION_CONFIGS()['cz.sql.top_n'] AS INT);

SESSION_CONFIGS()['key'] 与 CURRENT_SETTING('key') 的区别

-- cz.sql.timezone 是系统内置配置,不在无参数 MAP 中 SELECT SESSION_CONFIGS()['cz.sql.timezone']; -- 返回: NULL SELECT CURRENT_SETTING('cz.sql.timezone'); -- 返回: 'Asia/Shanghai' -- 用户通过 SET 设置的参数,两种写法结果一致 SET cz.sql.my_param = 'hello'; SELECT SESSION_CONFIGS()['cz.sql.my_param']; -- 返回: 'hello' SELECT CURRENT_SETTING('cz.sql.my_param'); -- 返回: 'hello'

查看所有服务端会话配置

-- 返回 MAP 类型 SELECT SESSION_CONFIGS(); -- 查看所有 key SELECT map_keys(SESSION_CONFIGS());

在表达式和 WHERE 中使用

-- 在 WHERE 中使用 SELECT * FROM t WHERE CURRENT_SETTING('cz.sql.timezone') IS NOT NULL; -- 在 CONCAT 中拼接 SELECT CONCAT('tz=', CURRENT_SETTING('cz.sql.timezone')); -- 返回: 'tz=Asia/Shanghai' -- 确认返回类型 SELECT typeof(CURRENT_SETTING('cz.sql.timezone')), typeof(SESSION_CONFIGS()); -- 返回: 'string', 'map<string,string>'

动态表参数化(dt.args)

SESSION_CONFIGS()['dt.args.<key>']
SESSION_CONFIGS()['dt.args.<key>']
是动态表的核心参数化机制。在动态表的
AS
AS
查询中引用
dt.args.*
dt.args.*
参数,每次 REFRESH 时通过
SET dt.args.<key>=<value>
SET dt.args.<key>=<value>
传入不同的值,实现按分区按需刷新,无需为每个参数值创建独立的动态表。

基本用法:

-- 第一步:定义动态表,用 SESSION_CONFIGS()['dt.args.<key>'] 作为参数占位符 CREATE DYNAMIC TABLE dt_daily REFRESH ON DEMAND AS SELECT region, order_date, SUM(amount) AS revenue FROM orders WHERE order_date = SESSION_CONFIGS()['dt.args.date']; -- 第二步:刷新时在同一 SQL 中先 SET 再 REFRESH(分号分隔) SET dt.args.date = '2024-01-01'; REFRESH DYNAMIC TABLE dt_daily; -- 换一个日期刷新 SET dt.args.date = '2024-01-02'; REFRESH DYNAMIC TABLE dt_daily;

分区动态表按分区刷新:

dt.args.*
dt.args.*
PARTITIONED BY
PARTITIONED BY
搭配使用,每次只刷新目标分区:

CREATE DYNAMIC TABLE dt_orders_by_date REFRESH ON DEMAND PARTITIONED BY (order_date) AS SELECT region, order_date, SUM(amount) AS revenue, COUNT(*) AS order_cnt FROM orders WHERE order_date = SESSION_CONFIGS()['dt.args.date']; -- SET 和 PARTITION 子句的值必须一致,否则报错 SET dt.args.date = '2024-01-01'; REFRESH DYNAMIC TABLE dt_orders_by_date PARTITION (order_date = '2024-01-01'); SET dt.args.date = '2024-01-02'; REFRESH DYNAMIC TABLE dt_orders_by_date PARTITION (order_date = '2024-01-02');

多参数:

CREATE DYNAMIC TABLE dt_hourly REFRESH ON DEMAND PARTITIONED BY (event_date, event_hour) AS SELECT event_date, event_hour, COUNT(*) AS event_cnt, SESSION_CONFIGS()['dt.args.date'] AS loaded_date, CAST(SESSION_CONFIGS()['dt.args.hour'] AS INT) AS loaded_hour FROM events WHERE event_date = SESSION_CONFIGS()['dt.args.date'] AND event_hour = CAST(SESSION_CONFIGS()['dt.args.hour'] AS INT); -- 同时绑定多个参数 SET dt.args.date = '2024-01-01'; SET dt.args.hour = '9'; REFRESH DYNAMIC TABLE dt_hourly PARTITION (event_date = '2024-01-01', event_hour = 9);

在 JOIN 条件中使用:

CREATE DYNAMIC TABLE dt_joined REFRESH ON DEMAND AS SELECT a.id, a.value, b.label FROM fact_table a JOIN dim_table b ON a.id = b.id AND a.dt = SESSION_CONFIGS()['dt.args.date'] AND b.dt = SESSION_CONFIGS()['dt.args.date'];

类型转换:

dt.args.*
dt.args.*
的值始终是
STRING
STRING
类型,需要其他类型时显式转换:

CAST(SESSION_CONFIGS()['dt.args.hour'] AS INT) CAST(SESSION_CONFIGS()['dt.args.date'] AS DATE) CAST(SESSION_CONFIGS()['dt.args.amount'] AS DECIMAL(12,2))

注意事项

  • SESSION_CONFIGS()
    SESSION_CONFIGS()
    无参数 MAP 只包含服务端注入的
    cz.sql.*
    cz.sql.*
    运行时配置,以及同一 SQL 中
    SET
    SET
    cz.sql.*
    cz.sql.*
    参数;系统内置配置(如
    cz.sql.timezone
    cz.sql.timezone
    )不在其中,读取请用
    CURRENT_SETTING('key')
    CURRENT_SETTING('key')
  • key 不存在时:
    CURRENT_SETTING
    CURRENT_SETTING
    返回空字符串
    ""
    ""
    SESSION_CONFIGS()['key']
    SESSION_CONFIGS()['key']
    下标形式返回
    NULL
    NULL
  • dt.args.*
    dt.args.*
    仅在动态表的
    AS
    AS
    查询中有实际意义;在普通
    SELECT
    SELECT
    中引用返回
    NULL
    NULL
    ,不报错。
  • SET dt.args.<key>
    SET dt.args.<key>
    必须和
    REFRESH
    REFRESH
    同一 SQL 中执行(分号分隔),否则参数不生效。
  • 分区动态表刷新时,
    dt.args.*
    dt.args.*
    绑定的值必须与
    PARTITION (...)
    PARTITION (...)
    中的分区值一致,否则运行时报错。
  • 函数在每个查询中只求值一次(QUERY_SCOPE),不是逐行求值。

相关文档

联系我们
预约咨询
微信咨询
电话咨询
邮件咨询