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 出了问题。
雪花所做的是:
- 连接到数据库
- 将我从talend生成的插入文件放到服务器
- 将数据复制到临时文件 table
- 将数据从临时 table 复制到我的事件 table
- 删除温度 table
- 提交
我在这里错过了什么?
谢谢
你在检查温度 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
我不明白为什么 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 出了问题。
雪花所做的是:
- 连接到数据库
- 将我从talend生成的插入文件放到服务器
- 将数据复制到临时文件 table
- 将数据从临时 table 复制到我的事件 table
- 删除温度 table
- 提交
我在这里错过了什么?
谢谢
你在检查温度 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