为在我们的配置单元数据仓库中实现代理密钥,我将范围缩小到2个:
1)反映('java.util.UUID','randomUUID') 2)INPUT__FILE__NAME + BLOCK__OFFSET__INSIDE__FILE
以上哪个选项是更好的选择?
还是您会建议一个更好的选择?
谢谢。
答案 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