雪花-暂存文件中的UPSERT

时间:2020-07-25 04:55:34

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

我正在构建供个人使用的BULK UPSERT功能。我目前正在将多个文件上传到S3,然后使用CREATE STAGE命令创建一个舞台。

CREATE OR REPLACE TEMPORARY STAGE {stage}
                URL={s3_dir}
                CREDENTIALS=(aws_key_id='{aws_key_id}' aws_secret_key='{aws_secret_key}')
                {file_format}

现在,我想使用此阶段在Snowflake的目标表中进行UPSERT。有人可以提供一个例子吗?

TIA

2 个答案:

答案 0 :(得分:1)

Snowflake将MERGE命令用于UPSERT。我相信您可以在下面找到示例:

https://support.snowflake.net/s/article/how-to-perform-a-mergeupsert-from-a-flat-file-staged-on-s3

这是实际的合并文档:

https://docs.snowflake.com/en/sql-reference/sql/merge.html

答案 1 :(得分:0)

显然,MERGE支持以下类型的DB对象将数据从源移动到目标。支持的来源是:

  • 内部舞台
  • 外部舞台
  • 子查询

以下是我在代码库中使用的SQL代码段:

CREATE OR REPLACE TEMPORARY STAGE DUMMY_STAGE
FILE_FORMAT=(
            TYPE=CSV
            COMPRESSION=AUTO
            FIELD_DELIMITER='^'
            VALIDATE_UTF8=TRUE
            EMPTY_FIELD_AS_NULL=TRUE
            ENCODING=UTF8
            ERROR_ON_COLUMN_COUNT_MISMATCH=FALSE
            RECORD_DELIMITER='\r\n'
            ESCAPE=NONE
            ESCAPE_UNENCLOSED_FIELD=NONE
            FIELD_OPTIONALLY_ENCLOSED_BY='"'
            NULL_IF = ('0000-00-00', '', 'None')
);

PUT file://data_files/random.txt @DUMMY_STAGE;

MERGE INTO DUMMY_A
USING
    (
        SELECT
          $1 foo
          , $2 bar
        FROM @DUMMY_STAGE
    ) DUMMY_TMP
ON
    DUMMY_A.FOO=DUMMY_TMP.FOO
WHEN MATCHED THEN
    UPDATE SET 
      foo = DUMMY_TMP.foo
WHEN NOT MATCHED THEN
    INSERT
    (
        foo
        , bar
    )
    VALUES
    (
        DUMMY_TMP.foo
        , DUMMY_TMP.bar
    )
;