Я работаю над реализацией 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