Может ли Pyspark HASH() безопасно преобразовать UUID/GUID в BIGINT, сохраняя уникальность в Databricks?Python

Программы на Python
Anonymous
Может ли Pyspark HASH() безопасно преобразовать UUID/GUID в BIGINT, сохраняя уникальность в Databricks?

Сообщение Anonymous »

Справочная информация
Я работаю над реализацией Databricks Lakehouse, и мы создаем несколько суррогатных ключей для нескольких таблиц, чтобы облегчить стандартизацию последующих соединений. У нас есть данные, поступающие из разных систем, которые используют разные типы ключей-идентификаторов, и мы стандартизируем их для использования одного суррогатного ключа.
Мы начали с использования expr("uuid()" ) для генерации UUID в качестве наших ключей. Однако при дальнейшем исследовании кажется, что мы могли бы добиться большей эффективности хранения и производительности запросов, если бы могли использовать BIGINT (

Код: Выделить всё

LongType()
) вместо этого суррогатный ключ.
Размер таблиц: В ссылочной первичной таблице, где генерируются ключи, мы рассматриваем 200–300 тысяч строк. . А в последующих ссылающихся таблицах, имеющих ссылку на внешний ключ, мы имеем таблицы в диапазоне миллиардов и нескольких триллионов строк.
Альтернативы, которые мы пробовали
Потратил некоторое время на изучение того, будет ли новый столбец IDENTITY в Delta Lake удовлетворять этому требованию. Он обеспечивает генерацию ключей BIGINT, но имеет важное ограничение: если таблица определена со столбцом IDENTITY, она не может получать одновременные записи из нескольких входящих источников. Это основное ограничение, упомянутое при обсуждении этой функции в этом видео.
Потенциальное решение?
Рассматриваем перенос uuid() вызов функции xxHash64() для хеширования UUID в BIGINT. Глядя на список стандартных хеш-функций pyspark.sql, эта функция показалась мне той, которая могла бы гарантировать, что у нас есть BIGINT (хотя, учитывая размеры наших строк, возможно, просто 32-битный hash() тоже может работать?)
Вопросы
  • Делает ли withColumn('id', F.xxHash64(F.expr("uuid()) "))) хорошая идея? кажется, что она соответствует требованиям, но не уверен, есть ли какие-либо скрытые ошибки в этом подходе или в производительности или потенциальные дубликаты.
  • Можно ли предполагать, что если функция uuid() гарантирует уникальность, то ее хеширование также приведет к получению уникальных значений?
  • Нужно ли нам использовать 64-битный хэш или достаточно будет 32-битного хеша (при количестве строк менее 1M)?


Подробнее здесь: https://stackoverflow.com/questions/790 ... queness-in

Вернуться в «Python»