Avro 列中的 NULL 值加载为 VARIANT NULL
Posted
技术标签:
【中文标题】Avro 列中的 NULL 值加载为 VARIANT NULL【英文标题】:NULL value in Avro column is loaded as VARIANT NULL 【发布时间】:2021-05-18 19:36:46 【问题描述】:我正在使用带有 avro 文件的 stage 将数据批量加载到 Snowflake。雪花表中的列是 VARIANT 类型,在 avro 文件中定义为 null&string 的联合。可悲的是,此类列的 avro 中的空值作为 VARIANT null
而不是常规的 SQL NULL
加载到雪花中。它使我随后的 MERGE 查询复杂化。这是我的 COPY 查询:
copy into PUBLIC."_bp_staging_1621364335535_xxx"
from @~/batches
file_format = (type = avro compression = auto)
MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE
pattern = '.*parallel_batch_18441164121617616245\.avro$';
我当然可以使用 NULL_IF
参数,但是我必须为每个空的 VARIANT 字段发出该值,这对我来说似乎很浪费。
有没有更好的办法?
【问题讨论】:
【参考方案1】:“可悲的是,此类列的 avro 中的 null 值作为 VARIANT null 而不是常规 SQL NULL 加载到 Snowflake。这使我后续的 MERGE 查询变得复杂”
NULL Values
要将 VARIANT “null” 值转换为 SQL NULL,请将其转换为字符串。
【讨论】:
谢谢你,卢卡斯。是的,我可以转换它,但我不想这样做,因为这需要我枚举 COPY 查询中的所有列。 我宁愿考虑在 MERGE 或计算列中的用法。我看到你已经找到IS_NULL_VALUE
可以替代 variant_col:sth::string IS NULL
有趣的想法。我也会尝试一下,看看哪个使用较少的计算。【参考方案2】:
看起来没有办法改变这种行为,但 Snowflake 的工程师建议改为更改我的 MERGE 查询。
在 MERGE 查询中,我在更新部分的一种情况下使用 column is not null
when 条件。相反,他建议使用 IS_NULL_VALUE
函数,我只对 VARIANT 目标列使用该函数。
【讨论】:
以上是关于Avro 列中的 NULL 值加载为 VARIANT NULL的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C API 检查 SQLite 列中的值是不是为 NULL?