Можно ли использовать UUID в качестве суррогатного ключа для хранилища данных в улье? - PullRequest
1 голос
/ 11 марта 2019

Для реализации суррогатных ключей в нашем хранилище данных улья я сузил до 2 вариантов:

1) отражать ('java.util.UUID', 'randomUUID') 2) INPUT__FILE__NAME + BLOCK__OFFSET__INSIDE__FILE

Что из вышеперечисленного является лучшим вариантом?

Или вы бы предложили еще лучший вариант?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Я бы использовал встроенный SURROGATE_KEYS UDF. Это имеет преимущества перед UUID. Эта функция автоматически генерирует числовые идентификаторы для ваших строк при вводе данных в таблицу и может работать быстрее, чем UUID.

Пример:

1) Создайте таблицу учеников в формате ORC по умолчанию, который имеет свойства ACID.

CREATE TABLE students (row_id INT, name VARCHAR(64), dorm INT);

2) Вставить данные в таблицу. Например:

INSERT INTO TABLE students VALUES (1, 'fred flintstone', 100), (2, 'barney rubble', 200);

3) Создайте версию таблицы учеников, используя UDF SURROGATE_KEY.

CREATE TABLE students_v2 
(`ID` BIGINT DEFAULT SURROGATE_KEY(),
 row_id INT,
 name VARCHAR(64), 
 dorm INT, 
 PRIMARY KEY (ID) DISABLE NOVALIDATE);

4) Вставить данные, которые автоматически генерируют суррогатные ключи для первичных ключей.

INSERT INTO students_v2 (row_id, name, dorm) SELECT * FROM students;

5) Просмотр суррогатных ключей.

SELECT * FROM students_v2;

6) Добавьте суррогатные ключи в качестве внешнего ключа в другую таблицу, такую ​​как таблица student_grades, чтобы ускорить последующие объединения таблиц.

ALTER TABLE student_grades ADD COLUMNS (gen_id BIGINT);

MERGE INTO student_grades g USING students_v2 s ON g.row_id = s.row_id
WHEN MATCHED THEN UPDATE SET gen_id = s.id;

7) Выполнять быстрые соединения на суррогатных ключах.

( ПРИМЕЧАНИЕ: этот пример был скопирован из документации Hortonworks и добавлен здесь, так что даже если ссылка удалена, у нас есть пример для ссылки):

Есть и другие способы иметь суррогатный ключ в вашей таблице. Вот хорошая тема в этом обсуждении.

https://community.hortonworks.com/idea/8619/how-do-we-create-surrogate-keys-in-hive.html

0 голосов
/ 11 марта 2019

Для файлов ORC и последовательностей BLOCK__OFFSET__INSIDE__FILE не является уникальным для каждого файла, и в официальной документации говорится, что это смещение файла первого байта текущего блока

В некоторых ресурсах в Интернете говорится, что BLOCK__OFFSET__INSIDE__FILE является уникальным внутри текстовых файлов. Даже если это правда, почему вы должны ограничивать себя только текстовыми файлами.

Также UUID не зависит от входных файлов и может быть рассчитан после некоторого преобразования, в рабочем процессе, читающем тему Каффки, без файлов вообще и т. Д. Кроме того, UUID, сгенерированный в некоторой другой системе, также уникален в вашей системе, потому что UUID глобально уникальны. Кроме того, идентификаторы UUID имеют одинаковую длину, не зависят от длины структуры файлового каталога, а INPUT__FILE__NAME содержит все пути к файлам, что делает имя файла уникальным в одной и той же файловой системе.

Именно поэтому UUID является предпочтительным решением

...