【问题标题】:Snowflake - UPSERT from staged filesSnowflake - 来自暂存文件的 UPSERT
【发布时间】:2020-11-14 23:10:14
【问题描述】:

我正在构建供个人使用的 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

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 这也是我偶然发现的,但是文档对于 MERGE 语句支持的源不是很清楚。但是,我通过试错来判断自己。
    【解决方案2】:

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

    • 内部阶段
    • 外部阶段
    • 子查询

    以下是我在代码库中使用的 SQL sn-p:

    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
        )
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 2019-05-06
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多