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?

SQL Count 不计算列中的“NULL”

使用同一列中的最新值填充 NULL 值

根据其在另一列中的存在情况在 SQL 中打印值

Pandas 将 CSV 列中的 '\0' 读取为 NULL 字符并在 JSON 中打印为 Unicode

分区 BigQuery 表,从 AVRO 加载