【问题标题】:Load Avro file data to snowflake using merge query使用合并查询将 Avro 文件数据加载到雪花中
【发布时间】:2021-09-05 01:05:45
【问题描述】:

我有一个 avro 文件,我正在尝试使用合并查询将其内容插入雪花表。

Avro 文件是 test.avro.gz,它可能包含半结构化数据。 如果我将此文件转换为 json,它将具有如下数据: 示例:

{
    "ID" : 16,
    "VISITS" : 2,
    "DATE" : 1623801600,
    "DIMENSIONS" : [
        {
            "index" : 17,
            "value" : "(none)"
        }
    ],
    "TYPE" : "VISIT",
}
{
    "ID" : 18,
    "VISITS" : 4,
    "DATE" : 1623801600,
    "DIMENSIONS" : [
        {
            "index" : 7,
            "value" : "(none)"
        }
    ],
    "TYPE" : "VISIT",
}

我创建了一个文件格式和一个临时阶段:

snowflake_client.run("create or replace file format test_format type = 'avro'")
stage_name = f"test_{snowflake_client.generate_random_string()}"
create_stage = f"CREATE TEMPORARY STAGE {stage_name} COMMENT = 'TEMPORARY STAGE FOR test table DATA LOAD'"
snowflake_client.run(create_stage)
snowflake_client.run(f"put file://test.avro.gz @{stage_name} PARALLEL=16")

我使用的合并查询是:

query = f"MERGE INTO TEST USING (SELECT $1 ID, $2 VISITS,$3 DATE, $6 TOTALS, $7 TRAFFICSOURCE
           FROM @{stage_name} (file_format => 'test_format'))
           TEMP_STAGE ON TEST.ID= TEMP_STAGE.ID and TEST.VISITS=TEMP_STAGE.VISITS 
           WHEN NOT MATCHED THEN INSERT (ID,VISITS,DATE,TOTALS,DIMENSIONS,TYPE) VALUES 
           (TEMP_STAGE.ID,TEMP_STAGE.VISITS,TEMP_STAGE.DATE,TEMP_STAGE.DIMENSIONS,
           TEMP_STAGE.TYPE);"
                                                          
                                                            
snowflake_client.run(query)

我想要的是数据在 ID 和 VISITS 上是唯一的,因此我使用合并而不是复制。

雪花表的数据如下:

 ID   VISITS   DATE             DIMENSIONS                           TYPE
 16   2      1623801600         [{"index" : 17,"value" : "(none)"}]   VISIT
            

我得到的错误是:


**AVRO file format can produce one and only one column of type variant or object or array.

 Use CSV file format if you want to load more than one column.**

据我了解,它正在将所有数据加载到 $1,但我该如何解决这个问题并使用合并查询将 ID 和 VISITS 上唯一的数据插入到表中。

【问题讨论】:

  • Avro 是半结构化数据,因此您需要先将 Avro 文件加载到 VARIANT 类型的单个列中。之后,您可以使用点走格式从 VARIANT 中选择各个字段。

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


【解决方案1】:
MERGE INTO TEST USING (SELECT $1:ID ID, $1:VISITS VISITS,$1:DATE DATE, ...

您将拥有$1,并且对于您需要像对象一样访问的任何列。

【讨论】:

    猜你喜欢
    • 2021-04-12
    • 2022-01-08
    • 2020-10-07
    • 1970-01-01
    • 2021-06-27
    • 2020-09-30
    • 2020-09-27
    • 2020-04-21
    • 1970-01-01
    相关资源
    最近更新 更多