可以将UUID用作蜂巢中数据仓库的代理密钥吗?

时间:2019-03-11 14:29:44

标签: hive uuid

为在我们的配置单元数据仓库中实现代理密钥,我将范围缩小到2个:

1)反映('java.util.UUID','randomUUID') 2)INPUT__FILE__NAME + BLOCK__OFFSET__INSIDE__FILE

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

还是您会建议一个更好的选择?

谢谢。

2 个答案:

答案 0 :(得分:0)

对于ORC和序列文件,BLOCK__OFFSET__INSIDE__FILE不是每个文件都是唯一的,官方文档说它是 current block's first byte's file offset

some resources in the Internet中,据说BLOCK__OFFSET__INSIDE__FILE在文本文件中是唯一的。即使是这样,为什么还要限制自己仅使用TEXT文件。

UUID也不依赖于输入文件,并且可以在进行一些转换之后在读取Kaffka主题的工作流中进行计算,而无需任何文件,等等。 另外,在其他系统中生成的UUID在您的系统中也是唯一的,因为UUID是全局唯一的。 另外,UUID的长度相同,不取决于文件目录结构的长度,并且INPUT__FILE__NAME包含所有文件路径,这使文件名在同一文件系统中唯一。

这就是为什么UUID是首选解决方案的原因

答案 1 :(得分:0)

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

示例:

1)以具有ACID属性的默认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)使用SURROGATE_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 documentation复制并添加到此处,因此即使链接被删除,我们也有一个示例可供参考):

还有其他方法可以在表中使用代理键。这是该讨论的重点。

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