Snowflake Infer Schema读取S3分区Parquet缺失分区列问题咨询
Snowflake分区Parquet Schema推导及完整字段读取方案
Snowflake自带的INFER_SCHEMA函数默认仅推导Parquet文件内部存储的字段,不会自动提取S3路径中的分区键字段,可通过以下两种生产可用方案实现和PySpark一致的读取效果:
方案1:临时查询时手动补充分区字段
适合单次临时查询场景:
- 先用
INFER_SCHEMA推导文件原生字段的类型 - 查询时调用内置元数据字段
METADATA$FILENAME解析出分区键值补充到结果中
代码示例:
-- 推导Parquet文件原生字段的Schema,获取列名和对应类型 SELECT * FROM TABLE( INFER_SCHEMA( LOCATION=>'@你的S3阶段路径/分区根目录/', FILE_FORMAT=>'你的Parquet文件格式定义' ) ); -- 读取数据并补充分区字段 SELECT $1:AGMT_GID::NUMBER AS AGMT_GID, $1:AGMT_TRANS_GID::NUMBER AS AGMT_TRANS_GID, $1:DT_RECEIVED::VARCHAR AS DT_RECEIVED, -- 从文件路径中提取LATEST_TRANSACTION_CODE分区值 REGEXP_SUBSTR(METADATA$FILENAME, 'LATEST_TRANSACTION_CODE=([^/]+)', 1, 1, 'e') AS LATEST_TRANSACTION_CODE FROM @你的S3阶段路径/分区根目录/ (FILE_FORMAT => '你的Parquet文件格式定义');
方案2:创建外部表固化分区字段映射
适合长期频繁访问该分区数据集的场景:
CREATE EXTERNAL TABLE 分区Parquet外部表名 ( AGMT_GID NUMBER AS (value:AGMT_GID::NUMBER), AGMT_TRANS_GID NUMBER AS (value:AGMT_TRANS_GID::NUMBER), DT_RECEIVED VARCHAR AS (value:DT_RECEIVED::VARCHAR), LATEST_TRANSACTION_CODE VARCHAR AS (REGEXP_SUBSTR(metadata$filename, 'LATEST_TRANSACTION_CODE=([^/]+)', 1, 1, 'e')) ) LOCATION=@你的S3阶段路径/分区根目录/ FILE_FORMAT=你的Parquet文件格式定义;
创建完成后直接查询该外部表,即可得到包含分区字段在内的全部4个字段,和PySpark读取结果完全一致。
补充说明
若存在多层分区,只需重复调用REGEXP_SUBSTR函数从路径中提取对应分区键值即可,该方案性能和原生读取无显著差异。
内容的提问来源于stack exchange,提问作者gopinath kolanchi
相关产品推荐
相关产品推荐

