可以将UUID用作Hive DataWarehouse的替代密钥吗?



用于在我们的Hive数据仓库中实现替代密钥的

我已缩小到2个选项:

1)反射('java.util.uuid','randomuuid')2)input__file__name block__offset__inside__file

以上哪个是一个更好的选择?

或您建议一个更好的一个?

谢谢。

for orc和序列文件 BLOCK__OFFSET__INSIDE__FILE不是每个文件唯一的,官方文档表示它是当前块的第一个字节的文件offset

Internet中的某些资源中据说block__offset__inside __ file在文本文件中是唯一的。即使这是真的,为什么您应该将自己仅限于文本文件。

也不依赖输入文件,可以在某个转换后,在工作流程读取kaffka主题,根本没有文件等之后计算,等等。在某些其他系统中生成的UUID在您的系统中也是独特的,因为UUID在全球范围内是独一无二的。同样,UUID的长度相同,不依赖文件目录结构长度,并且INPUT__FILE__NAME包含所有文件路径,这使得文件名在同一文件系统中是独一无二的。

这就是为什么uuid是最好的解决方案

我将使用内置的SURROGATE_KEYS UDF。这比UUID具有优势。当您将数据输入表中时,此功能会自动为行生成数字ID,并且可以比UUID更快地执行。

示例:

1)以具有酸性属性的默认ORC格式创建学生表。

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)使用sermogate_key UDF创建学生表的版本。

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 document 中复制并在此处添加,以便即使链接被删除,我们都有一个示例):

还有其他方法可以在您的桌子中拥有一个替代钥匙。这是讨论的好主题。

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

最新更新