使用合并查询将 Avro 文件数据加载到雪花

时间:2021-06-21 10:49:02

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

我有一个 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 上唯一的数据插入到表中。

0 个答案:

没有答案