【发布时间】: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