DBT中如何基于PostgreSQL当前日期设置会话变量作为S3导出CSV文件名
DBT动态生成带时间戳的S3导出文件名解决方案
原生SQL写法报错原因
你原有SET语句无法运行是两个语法问题导致的:
- SQL中字符串字面量需要用单引号包裹,双引号仅用于标识表名、字段名等标识符
- 时间类型无法直接和字符串拼接,需要先按要求格式化为字符串
适配Redshift的可用实现方案
方案1:直接动态拼接文件名(无需设置会话变量)
不需要额外定义变量,直接在create_s3_uri参数中格式化时间并拼接后缀即可:
aws_commons.create_s3_uri( 'table_name', TO_CHAR(GETDATE(), 'YYYY-MM-DD-HH24MISS') || '-attrs.csv', 'us-east-1' )
方案2:修正后的会话变量写法
如果业务场景需要先定义变量再复用,可使用以下正确的SET语句:
SET session data_output.filename = TO_CHAR(GETDATE(), 'YYYY-MM-DD-HH24MISS') || '-attrs.csv';
调用逻辑和你原有写法一致:
aws_commons.create_s3_uri( 'table_name', current_setting('data_output.filename')::varchar, 'us-east-1' )
方案3:DBT Jinja原生变量实现(推荐,跨查询时间统一)
用DBT内置的运行时间变量定义全局文件名,整个dbt run执行周期内文件名的时间戳统一,不会出现多查询时间差导致的文件名不一致问题:
-- 模型开头定义变量 {% set output_filename = run_started_at.strftime("%Y-%m-%d-%H%M%S") ~ '-attrs.csv' %} -- 后续任意位置直接引用 aws_commons.create_s3_uri( 'table_name', '{{ output_filename }}', 'us-east-1' )
内容的提问来源于stack exchange,提问作者Lewis Smith
相关产品推荐
相关产品推荐

