【发布时间】:2019-03-11 14:29:43
【问题描述】:
为了在我们的 hive 数据仓库中实现代理键,我将选择范围缩小到 2 个:
1) 反射('java.util.UUID','randomUUID') 2) INPUT__FILE__NAME + BLOCK__OFFSET__INSIDE__FILE
以上哪个是更好的选择?
或者你会推荐一个更好的?
谢谢。
【问题讨论】:
为了在我们的 hive 数据仓库中实现代理键,我将选择范围缩小到 2 个:
1) 反射('java.util.UUID','randomUUID') 2) INPUT__FILE__NAME + BLOCK__OFFSET__INSIDE__FILE
以上哪个是更好的选择?
或者你会推荐一个更好的?
谢谢。
【问题讨论】:
对于 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 是更可取的解决方案
【讨论】:
我会使用内置的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
【讨论】: