Snowflake Copy 命令不在定义的 table 中插入数据

Snowflake Copy command does not insert data in the defined table

我不明白为什么 Snowflake 没有按应有的方式复制我的数据,所以我决定来这里问问你。

这是对我的过程的解释。我正在使用 Talend 进行数据转换,从一些 files/databases 中提取数据,最后将其导入 Snowflake。这是我的 Talend Job 的概述。

我的 Talend 作业运行良好,没有抛出任何错误。它应该将大约 9.6k 行导入 Snowflake table 命名事件。不幸的是,这不会发生。这是在“历史记录”窗格的 Snowflake 端发生的确切过程的 copy/past。

 1. SHOW GRANTS TO USER identifier("AMBA");
 2. SELECT * FROM EVENTS;
 3. SELECT CURRENT_DATABASE(), CURRENT_SCHEMA()
 4. alter session /* JDBC:SnowflakeConnectionV1.setAutoCommit*/ set autocommit=false
 5. show /* JDBC:DatabaseMetaData.getPrimaryKeys()
 6. show /* JDBC:DatabaseMetaData.getColumns() 
 7. PUT 'file://C:\Users\amba\AppData\Local\Temp\snowflake\stage\EVENTS\INSERT\20210826_185008_230_NLF1NE_1\stream_20210826_185008_2300.gz' '@~/EVENTS/INSERT/20210826_185008_230_NLF1NE_1' parallel=10 overwrite=true auto_compress=false SOURCE_COMPRESSION=gzip
 8. show columns in "EVENTS"
 9. CREATE TEMPORARY TABLE "EVENTS_20210826_185008_230_1" LIKE "EVENTS"
 10. COPY INTO "EVENTS_20210826_185008_230_1" FROM '@~/EVENTS/INSERT/20210826_185008_230_NLF1NE_1' on_error='CONTINUE' file_format=( field_optionally_enclosed_by='"' empty_field_as_null=true)
 11. COPY INTO "EVENTS_20210826_185008_230_1" FROM '@~/EVENTS/INSERT/20210826_185008_230_NLF1NE_1' validation_mode='return_all_errors' file_format=(field_optionally_enclosed_by='"'empty_field_as_null=true) -- HERE I CAN SEE MY 9.6K ROWS
 12. INSERT INTO "EVENTS"("ID","ODB_CREATED_AT","EVENT_TIME","DEVICE_TYPE","EVENT_TYPE","TICKET_TYPE","CARD_NR","COUNT","MANUFACTURER","CARPARK_ID") SELECT * FROM "EVENTS_20210826_185008_230_1"
 13. RM '@~/EVENTS/INSERT/20210826_185008_230_NLF1NE_1'
 14. commit
 15. commit

历史截图如下:

这里是按升序排列的复制和插入语句,首先它抛出一个错误:

1) Load error, all 1 files were rejected: COPY INTO "EVENTS_20210826_185008_230_1" FROM '@~/EVENTS/INSERT/20210826_185008_230_NLF1NE_1' on_error='CONTINUE' file_format=( field_optionally_enclosed_by='"' empty_field_as_null=true)

2) Succeeded: The copy into: COPY INTO "EVENTS_20210826_185008_230_1" FROM '@~/EVENTS/INSERT/20210826_185008_230_NLF1NE_1' validation_mode='return_all_errors' file_format=(field_optionally_enclosed_by='"'empty_field_as_null=true)

3) Succeeded: The insert statement: INSERT INTO "EVENTS"("ID","ODB_CREATED_AT","EVENT_TIME","DEVICE_TYPE","EVENT_TYPE","TICKET_TYPE","CARD_NR","COUNT","MANUFACTURER","CARPARK_ID") SELECT * FROM "EVENTS_20210826_185008_230_1"

我已经尝试将数据导入 postgres 数据库和简单的 csv 文件,工作得很好,所以错误不可能来自 Talend,一定是 Snowflake 出了问题。

雪花所做的是:

我在这里错过了什么?

谢谢

你在检查温度 table 结果吗?

这是原因和解决方法。

我尝试使用 Talend 将 id 作为主键导入到 Snowflake。 Snowflake 不允许您使用和 id 列插入,因为它们是我们在创建 table.

时定义的自动生成的

示例:

CREATE TABLE IF NOT EXISTS public.events (
    id bigint NOT NULL autoincrement start 1 increment 1 PRIMARY KEY,
    odb_created_at timestamp without time zone NOT NULL,
    event_time timestamp without time zone NOT NULL,
    device_type integer NOT NULL,
    event_type integer NOT NULL,
    ticket_type integer NOT NULL,
    card_nr character varying(100),
    count integer DEFAULT 1 NOT NULL,
    manufacturer character varying(200),
    carpark_id bigint

我不得不删除由 Talend 生成的 ID 插入,让 Snowflake 完成工作。 之所以会出现NOT NULL错误码,是因为SQL中的id被设置为NOT NULL(当然是因为是ID)。不要将 ID 与 SNOWFLAKE 一起使用。

解决方法:直接在Snowflake中使用autoincrement或者使用没有autoincrement的sequence