加入或按变体列分组:一个好的做法?



我们需要在 Snowflake 中对记录集(数亿行(进行重复数据删除,引擎允许您直接使用变体列group byjoin,但(显然(这是一个消耗资源的过程。问题是VARIANT列的 JSON 内容的架构可能会更改,恕不另行通知,因此我们不能简单地为重复数据删除 SQL 语句提取必填字段(或所有字段((这要快得多(。

有谁知道使用 VARIANT 列执行联接或组是否本质上是错误的? 还是可能导致错误的结果?

问候 巴巴克。

我知道这里没有什么"固有"的错误。不过,它不会很好地扩展到大型表或非常大的变体列。

当数据被解析为变体时,SnowFlake 确实会对它们进行一些处理,以便进行索引、空处理和性能。值得注意的是,与 SQL NULL 不同,变量 nulls(JSON 中的 null 值(可以与自身相等进行比较。此外,数字和日期等数据类型在变体中存储为字符串,并使用字符串相等性。因此,如果您的数据源以不同的方式处理数据类型,您可能会看到2020-01-01 12:00:00.00被视为不等于2020-01-01 12:00:00的情况,但我尚未对此进行测试。

这种处理是为什么您注意到(在单独的注释中({"a":1,"b":2}的存储方式与{"b": 2, "a": 1}相同,因此它们彼此"相等"。因此,从技术上讲,这可以算作"误报",当您不希望它们相等时加入。但据我所知,这种处理是一致的,你不应该得到假阴性。

在我的测试中,它似乎工作正常——除非你希望数组中项目的顺序无关紧要。 如果它在内部存储对象的哈希,那么它可能具有合理的性能。 最后请注意变体缺乏真实性:select 1='1', 1::variant = '1'::variant;返回TRUE,FALSE'。

最新更新