Snowflake从Stage加载数据时如何指定多格式日期转换
问题描述
我在S3存储桶中有一个CSV文件,里面的日期列格式各不相同,需要把数据插入到所有列都是Date类型的Snowflake表(示例表名:"DB_NAME-XX"."SCHEMA_NAME-XX"."TABLE_NAME-XX")。
示例Stage数据:
col_1 | col_2 | col_3 2017/12/01 | 1996 | 20101201
插入Snowflake表后需要变成这样:
COL_1 | COL_2 | COL_3 2017-12-01 | 1996-01-01 | 2010-12-01
我现在用的COPY INTO命令是这样的:
copy into "DB_NAME-XX"."SCHEMA_NAME-XX"."TABLE_NAME-XX" from s3://bucket_name_xx/folder_name_xx/ credentials=(aws_key_id='xxxxxxxxxxxxxx' aws_secret_key='yyyyyyyyyyyyyyyyyyyyyy') file_format = (type = csv field_delimiter = '|' skip_header = 1) validation_mode = 'RETURN_1000000_ROWS';
不知道怎么在命令里指定不同的日期格式,请问怎么把这些多格式的日期数据正确插入到Snowflake表?
解决方案
因为CSV里各列的日期格式不一样,没法在文件格式里设置统一的DATE_FORMAT,得在COPY INTO的FROM子句里对每一列做显式转换:
修改后的COPY INTO命令
copy into "DB_NAME-XX"."SCHEMA_NAME-XX"."TABLE_NAME-XX" (COL_1, COL_2, COL_3) from ( select -- 处理col_1:格式是YYYY/MM/DD TO_DATE($1, 'YYYY/MM/DD'), -- 处理col_2:只有年份,转成当年1月1日 TO_DATE($2, 'YYYY'), -- 处理col_3:格式是YYYYMMDD TO_DATE($3, 'YYYYMMDD') from s3://bucket_name_xx/folder_name_xx/ ) credentials=(aws_key_id='xxxxxxxxxxxxxx' aws_secret_key='yyyyyyyyyyyyyyyyyyyyyy') file_format = (type = csv field_delimiter = '|' skip_header = 1) validation_mode = 'RETURN_1000000_ROWS';
关键说明
$1、$2、$3对应CSV跳过表头后的第1、2、3列。TO_DATE的第二个参数是原始数据的格式掩码,Snowflake支持多种格式:YYYY/MM/DD:匹配2017/12/01这类带斜杠的日期YYYY:匹配仅年份的1996,自动补全为1996-01-01YYYYMMDD:匹配20101201这类无分隔符的日期
- 如果某列有多种格式变体,可以在
TO_DATE里指定多个掩码,用逗号分隔,比如TO_DATE($1, 'YYYY/MM/DD, MM/DD/YYYY'),Snowflake会自动尝试匹配合适的格式。
内容的提问来源于stack exchange,提问作者Santhosh
相关产品推荐
相关产品推荐

