Колонка «Присоединиться или группироваться по VARIANT»: хорошая практика? - PullRequest
1 голос
/ 30 января 2020

Нам нужно дедуплицировать набор записей (сотни миллионов строк) в Snowflake, и движок позволяет вам group by или join напрямую использовать вариантный столбец, но (очевидно) это процесс, потребляющий ресурсы. Проблема состоит в том, что схема содержимого JSON столбца VARIANT может изменяться без предварительного уведомления, поэтому мы не можем просто извлечь необходимые поля (или все поля) для операторов дедупликации SQL (что намного быстрее) ).

Кто-нибудь знает, если выполнение объединения или группы с использованием столбца VARIANT по своей сути неверно? или возможно, что это приведет к неправильным результатам?

С уважением, Бабак.

Ответы [ 2 ]

1 голос
/ 31 января 2020

Нет ничего «изначально» неправильного, о чем я знаю здесь. Это не будет хорошо масштабироваться до больших таблиц или очень больших вариантов столбцов.

Когда данные анализируются в варианте, SnowFlake выполняет некоторую обработку для них с целью индексации, обработки нулевых значений и производительности. Примечательно, что нулевые значения Variant, нулевое значение внутри JSON, можно сравнивать как равные себе, в отличие от SQL NULLS. Кроме того, типы данных, такие как числа и даты, хранятся в виде строк, когда они находятся внутри варианта, и используют равенство строк. Поэтому, если ваши источники данных обрабатывают типы данных по-разному, вы можете увидеть сценарий, в котором 2020-01-01 12:00:00.00 рассматривается как не равный 2020-01-01 12:00:00, но я не проверял это.

Эта обработка является причиной того, что вы заметил (в отдельном комментарии), что {"a":1,"b":2} хранится так же, как и {"b": 2, "a": 1}, и поэтому они "равны" друг другу. Так что это технически может считаться «ложным срабатыванием», присоединяясь, когда вы не ожидаете, что они будут равны. Но, насколько я знаю, эта обработка последовательна, и вы не должны получать ложные негативы.

1 голос
/ 30 января 2020

В моих тестах это работает нормально - если только вы не хотите, чтобы порядок элементов в массивах не имел значения. Если это внутренне хранит ha sh для объектов, то это может быть разумно производительным. В заключение отметим отсутствие правдивости вариантов: select 1='1', 1::variant = '1'::variant; возвращает TRUE, FALSE`.

...