根据Snowflake文档(https://docs.snowflake.net/manuals/user-guide/tables-clustering-keys.html),可以将群集键定义为一个或多个表列/表达式。 他们带来的示例是:
-- cluster by expressions
create or replace table t2 (c1 timestamp, c2 string, c3 number) cluster by (to_date(c1), substring(c2, 0, 10));
我想从日期列中提取年,月和日,并基于这些表达式创建集群键,但是没有找到解决方法。 这是我已经尝试过的:
CREATE TABLE TBL_DATECREATED (DATECREATED_UTC)
CLUSTER BY (
TO_DATE(DATECREATED_UTC)
)
AS
SELECT DATECREATED_UTC FROM BASETABLE_CONTACTS
结果:
SQL compilation error: invalid type [TO_DATE(TBL_DATECREATED.DATECREATED_UTC)] for parameter 'TO_DATE'
**提示:
SELECT TO_DATE(DATECREATED_UTC) FROM BASETABLE_CONTACTS
正常!
CREATE MATERIALIZED VIEW MV_DATECREATED (DATECREATED_UTC, EMAILADDRESS)
CLUSTER BY ( year(DATECREATED_UTC)
-- extract(year from DATECREATED_UTC)
,EMAILADDRESS
)
AS
SELECT DATECREATED_UTC, EMAILADDRESS FROM BASETABLE_CONTACTS
结果:
SQL compilation error: Function EXTRACT does not support UNKNOWN argument type
(for commented expression i received the same error message)
CREATE MATERIALIZED VIEW MV_DATECREATED (DATECREATED_UTC, EMAILADDRESS)
CLUSTER BY ( DATECREATED_UTC
,substring(EMAILADDRESS, 1, 3)
)
AS
SELECT DATECREATED_UTC, EMAILADDRESS FROM BASETABLE_CONTACTS
结果:
SQL compilation error: error line 3 at position 14 Invalid argument types for function 'SUBSTRING': (UNKNOWN, NUMBER(1,0), NUMBER(1,0))
预先感谢您的每个建议/解决方案!
答案 0 :(得分:0)
尝试以下操作,当您在创建表的同时定义集群键时,Snowflake可能无法正确确定列的数据类型?
CREATE MATERIALIZED VIEW MV_DATECREATED (DATECREATED_UTC timestamp, EMAILADDRESS varchar)
CLUSTER BY ( year(DATECREATED_UTC)
-- extract(year from DATECREATED_UTC)
,EMAILADDRESS
)
AS
SELECT DATECREATED_UTC, EMAILADDRESS FROM BASETABLE_CONTACTS
答案 1 :(得分:0)
对于第一个错误,请尝试将数据类型添加到创建表中。例如:
CREATE TABLE TBL_DATECREATED (DATECREATED_UTC timestamptz)
对于第二和第三个问题,请检查数据类型是否符合您的期望。
答案 2 :(得分:0)
我们必须使用以下语句基于实例化视图的表达式来定义集群键。
CREATE or replace MATERIALIZED VIEW MV_DATECREATED (DATECREATED_UTC,EMAILADDRESS) cluster by(DATECREATED_UTC,EMAILADDRESS ) AS SELECT to_date(DATECREATED_UTC), EMAILADDRESS FROM BASETABLE_CONTACTS;
CREATE or replace MATERIALIZED VIEW MV_DATECREATED (DATECREATED_UTC,EMAILADDRESS) cluster by(DATECREATED_UTC,EMAILADDRESS ) AS SELECT DATECREATED_UTC, EMAILADDRESS FROM BASETABLE_CONTACTS;
alter materialized view MV_DATECREATED cluster by(TO_DATE(DATECREATED_UTC),EMAILADDRESS );