如何在Snowflake中从含当日日期的Stage路径读取数据
在Snowflake中读取Stage动态日期路径下的文件
文件按
yyyy/mm/dd/hh格式的日期小时路径存储,需要读取当日对应路径(如2023/03/27/04)下的文件记录。尝试了以下代码但无法运行,如何传递动态变量date_hour_folder或其他实现方式?
用户尝试的代码:
set date_hour_folder=TO_VARCHAR(DATEADD(hour, -6, convert_timezone('UTC', current_timestamp())), 'yyyy/mm/dd/hh'); SELECT $1:name , $1:address , $1:id FROM @test_prod.test/dev/test/device_d_rollup_parquet_expor2t/{date_hour_folder}/ (file_format => 'my_parquet_format', PATTERN => '.*.parquet')
方法1:修正会话变量引用方式
Snowflake中引用会话变量需使用$符号,而非{},同时正则匹配里的.需要转义(避免匹配任意字符),修改后代码如下:
SET date_hour_folder = TO_VARCHAR(DATEADD(hour, -6, CONVERT_TIMEZONE('UTC', CURRENT_TIMESTAMP())), 'yyyy/mm/dd/hh'); SELECT $1:name, $1:address, $1:id FROM @test_prod.test/dev/test/device_d_rollup_parquet_expor2t/$date_hour_folder/ (FILE_FORMAT => 'my_parquet_format', PATTERN => '.*\\.parquet');
方法2:使用动态SQL(复杂场景适用)
如果需要更灵活的路径逻辑,可通过动态SQL拼接执行语句:
DECLARE date_hour_folder VARCHAR; sql_stmt VARCHAR; BEGIN date_hour_folder := TO_VARCHAR(DATEADD(hour, -6, CONVERT_TIMEZONE('UTC', CURRENT_TIMESTAMP())), 'yyyy/mm/dd/hh'); sql_stmt := 'SELECT $1:name, $1:address, $1:id FROM @test_prod.test/dev/test/device_d_rollup_parquet_expor2t/' || date_hour_folder || '/ (FILE_FORMAT => ''my_parquet_format'', PATTERN => ''.*\\.parquet'')'; EXECUTE IMMEDIATE sql_stmt; END;
方法3:直接在PATTERN中拼接路径
无需定义变量,直接将日期路径整合到正则匹配规则中:
SELECT $1:name, $1:address, $1:id FROM @test_prod.test/dev/test/device_d_rollup_parquet_expor2t/ (FILE_FORMAT => 'my_parquet_format', PATTERN => TO_VARCHAR(DATEADD(hour, -6, CONVERT_TIMEZONE('UTC', CURRENT_TIMESTAMP())), 'yyyy/mm/dd/hh') || '/.*\\.parquet');
内容的提问来源于stack exchange,提问作者NEERAJ GUPTA
相关产品推荐
相关产品推荐

