Parquet加载至Snowflake表时int32字段被转换为时长类型问题咨询
异常转换原因
- Snowflake从Parquet格式加载数据到VARIANT类型列时,默认开启字段自动类型推断逻辑:当字段名包含
latency、duration、time等和时间相关的关键词时,会优先将int32类型的整数值按照毫秒级时长转换为TIME类型,你看到的"00:00:18"就是18123毫秒转换后的结果。 - 其余int64类型列未触发转换,是因为Snowflake对int64类型的默认推断逻辑优先指向微秒/纳秒级时间戳,字段名匹配度未达到触发时长转换的阈值,因此保留了原始整数值。
解决方案
方案1:加载时禁用自动类型转换(推荐,从根源避免问题)
在COPY命令的文件格式参数中添加disable_auto_convert = TRUE,即可禁用Parquet加载过程中的所有隐式类型转换,将字段按Parquet中的原始类型写入VARIANT列,修改后的COPY命令如下:
copy into my_table from @my_table/dt=20211023/ pattern='.*/.*/.*/.*' file_format = (type = parquet, disable_auto_convert = TRUE);
方案2:已加载数据的补救方案
如果已经完成加载不想重跑数据,可以在查询时将转换后的TIME类型值反向转回原始毫秒整数:
select datediff('millisecond', '00:00:00', v:full_latency::time) as full_latency from my_table limit 1;
执行上述查询可以得到原始的18123整数值。
内容的提问来源于stack exchange,提问作者user4601931
相关产品推荐
相关产品推荐

