Snowflake外部表多列分区及表字段分区配置咨询
Snowflake外部表分区问题解答
针对你提到的两个外部表分区问题,直接给出明确结论和说明:
- 多列分区配置是原生支持的。你可以在
PARTITION BY子句中传入多个分区键,PARTITION BY (date, time)这类多字段写法语法完全合法,只要传入的列本身是符合外部表分区规则的合法列即可。 - 不支持直接使用外部表的常规业务字段(即从底层存储文件内容解析得到的字段,比如name、create_date这类字段)作为分区键。
核心逻辑:Snowflake外部表的分区裁剪发生在云存储文件扫描阶段,全程不需要打开、读取文件内容,因此所有分区键的取值必须可以从文件元数据(最常用的是
METADATA$FILENAME即文件路径字段)直接解析得到。如果用存储在文件内部的业务字段做分区,Snowflake必须先全量扫描读取所有文件的内容才能拿到字段值完成分区计算,分区裁剪减少扫描量、降低查询成本的核心作用会完全失效,因此产品层面直接禁止这类配置。
以下是合法的多分区列外部表建表示例:
CREATE EXTERNAL TABLE user_behavior_external ( log_date DATE AS TO_DATE(SPLIT_PART(METADATA$FILENAME, '/', 4)), log_hour TIME AS TO_TIME(SPLIT_PART(METADATA$FILENAME, '/', 5)), user_id VARCHAR AS (VALUE:user_id::VARCHAR), action VARCHAR AS (VALUE:action::VARCHAR) ) PARTITION BY (log_date, log_hour) LOCATION = @oss_behavior_logs/dt= FILE_FORMAT = (TYPE = JSON);
如果建表时在PARTITION BY子句中引用了需要读取文件内容才能获取的常规字段,语句会直接报错,无法创建成功。
内容的提问来源于stack exchange,提问作者CanIget eb1
相关产品推荐
相关产品推荐

