【问题标题】:Snowflake Copy command does not insert data in the defined tableSnowflake Copy 命令不会在定义的表中插入数据
【发布时间】:2021-10-26 22:19:24
【问题描述】:

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

这是我的过程的解释。我正在使用 Talend 进行数据转换,以从一些文件/数据库中提取数据并最终将其导入 Snowflake。这是我的 Talend 工作的概述。

我的 Talend 工作运行良好,不会引发任何错误。它应该将大约 9.6k 行导入到名为 Events 的 Snowflake 表中。不幸的是,这并没有发生。这是“历史记录”窗格中雪花端发生的确切过程的副本/过去。

 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 生成的插入文件放入服务器
  • 将数据复制到临时表中
  • 将临时表中的数据复制到我的事件表中
  • 删除临时表
  • 提交

我在这里错过了什么?

谢谢

【问题讨论】:

  • 请您提供完整的 INSERT INTO EVENTS 声明。不删除临时表(在测试时)可能是值得的,这样您就可以查看它是否被正确填充
  • 嗨@NickW,我刚刚编辑了我的帖子并在第二个屏幕截图之后添加了语句。正如我所看到的,它首先抛出一个错误,然后将我的 9.6k 行复制到临时表中。不幸的是,我无法阻止雪花删除临时表,因为它是一个自动过程......我从日志中可以看到临时事件表确实被填满了

标签: snowflake-cloud-data-platform talend snowflake-schema


【解决方案1】:

这是原因和解决方法。

我尝试使用 Talend 将 id 作为主键导入到 Snowflake。 Snowflake 不允许您使用和 id 列插入,因为这些是在我们在创建表时定义时自动生成的。

例子:

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)。不要在 SNOWFLAKE 中使用 ID。

解决方案:直接在 Snowflake 中使用自增或使用没有自增的序列。

【讨论】:

    【解决方案2】:

    你在检查临时表结果吗?

    【讨论】:

    • 所以问题似乎是这里的主键,称为 ID 的列。当我删除它时,我可以轻松导入我的数据...
    猜你喜欢
    • 1970-01-01
    • 2015-11-23
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2023-02-20
    • 2021-09-07
    相关资源
    最近更新 更多