Snowflake中的分区语法错误和无法加载默认数据

Cluster By Partitioning Syntax Error in Snowflake and Unable to load default data

提问人:Ramakrishna K 提问时间:8/2/2023 最后编辑:marc_sRamakrishna K 更新时间:8/2/2023 访问量:50

问:

我是雪花的新手。当我试图学习雪花时,我遇到了两个问题,即

问题 #1

当我尝试执行以下命令时,出现语法错误

命令:

CREATE OR REPLACE TABLE PUBLIC.CUSTOMER_CLUSTER (
 C_CUSTKEY NUMBER(38,0),
 C_NAME VARCHAR(25),
 C_ADDRESS VARCHAR(40),
 C_NATIONKEY NUMBER(38,0),
 C_PHONE VARCHAR(15),
 C_ACCTBAL NUMBER(12,2),
 C_MKTSEGMENT VARCHAR(10),
 C_COMMENT VARCHAR(117),
 cluster BY (C_NATIONKEY)
);

错误:

语法错误行 11 在位置 0 意外的 ')'

我在功能集群上遇到错误。

问题 #2

insert into public.customer_nocluster 
    select * 
    from snowflake_SAMPLE_DATA.TPCH_SF1000.CUSTOMER;

在上面的命令中

customer_nocluster -> table_name
snowflake_SAMPLE_DATA.TPCH_SF1000.CUSTOMER -> 

我们从 Snowflake 私有数据(帐户中可用的默认数据)加载数据。

错误:

字符串 'ly pending pinto beans.快速待处理的请求根据愤怒的待处理海豚使用。小心前夕“太长,会被截断。

你能指导我做错的地方吗?

SQL 数据库 snowflake-cloud-data-platform 语法错误

评论

1赞 Isolated 8/2/2023
对于问题 1,您需要关闭 create table 语句,然后按 () 进行聚类。create table my_data (col1 int, col2 int) cluster by (col1);
0赞 Isolated 8/2/2023
对于问题 2,您在该列中存储的字符数是否有限制?您可能需要修改该列并扩展长度。如果表没有信息,并且您从空开始,那么也许只需使用 CTAS 语句来创建它。public.customer_nocluster
0赞 Ramakrishna K 8/2/2023
感谢您提供@Isolated信息。我已经理解了问题 1,但对于问题 2,我必须更改语法。你能用任何语法或例子来详细说明你的答案吗?
1赞 NickW 8/2/2023
通常,以这种方式使用 SELECT * 不是很好的做法。显式列出目标表中的列,显式列出 SELECT 中的列,并确保两个列表匹配

答:

1赞 Simeon Pilgrim 8/2/2023 #1

所以第二个问题:

如果我们发现失败的行:

select * from snowflake_SAMPLE_DATA.TPCH_SF1000.CUSTOMER
where c_comment like 'ly pending pinto beans. quickly pending requests%';

我们得到一行:

enter image description here

该字符串的长度为 111 个字节。

因此,如果 nocluster 的列宽为 110

CREATE OR REPLACE TABLE PUBLIC.CUSTOMER_NOCLUSTER (
 C_CUSTKEY NUMBER,
 C_NAME VARCHAR(25),
 C_ADDRESS VARCHAR(40),
 C_NATIONKEY NUMBER,
 C_PHONE VARCHAR(15),
 C_ACCTBAL NUMBER(12,2),
 C_MKTSEGMENT VARCHAR(10),
 C_COMMENT VARCHAR(110)
 );

然后复制进去,我们得到如下内容:

insert into public.customer_nocluster 
    select --*
        C_CUSTKEY
        ,C_NAME
        ,C_ADDRESS
        ,C_NATIONKEY
        ,C_PHONE
        ,C_ACCTBAL
        ,C_MKTSEGMENT
        ,C_COMMENT
    from snowflake_SAMPLE_DATA.TPCH_SF1000.CUSTOMER;

字符串'具有讽刺意味的存款。具有讽刺意味的是,快速定期存款的套餐狡猾地与快速 S' 太长,会被截断

因此,如果我们只取前 110 个字符:

insert into public.customer_nocluster 
    select --*
        C_CUSTKEY
        ,C_NAME
        ,C_ADDRESS
        ,C_NATIONKEY
        ,C_PHONE
        ,C_ACCTBAL
        ,C_MKTSEGMENT
        ,LEFT(C_COMMENT, 110)
    from snowflake_SAMPLE_DATA.TPCH_SF1000.CUSTOMER;

它现在运行得很愉快:

enter image description here

因此,关于“不使用 SELECT *”的 NickW 观点是,select star 按照它们在源表或视图中定义的顺序获取列,如果视图表的定义发生变化,对齐方式可能会被破坏,因此在“生产代码”中始终保持显式是一个好习惯。我在原型设计时使用 SELECT * 来“让它工作”,一旦一切都按预期进行,代码就会变得无聊/安全。

评论

0赞 Ramakrishna K 8/2/2023
非常感谢朝圣者@Simeon我做错了哪里的精彩解释。