为了在我们的配置单元数据仓库中实现代理键,我已经将范围缩小到两个选项:
1) reflect('java.util.UUID','randomUUID') 2) INPUT__FILE__NAME + BLOCK__OFFSET__INSIDE__FILE
以上哪一个是更好的选择?
或者你会推荐一个更好的吗?
谢谢。
发布于 2019-03-11 23:10:40
对于ORC和序列文件,每个文件的BLOCK__OFFSET__INSIDE__FILE不是唯一的,官方文档说它是
在中,据说BLOCK__OFFSET__INSIDE__FILE在文本文件中是唯一的。即使这是真的,为什么你要把自己限制在文本文件上。
此外,UUID不依赖于输入文件,可以在一些转换后计算,在阅读Kaffka主题的工作流中,根本没有文件,等等。另外,在一些其他系统中生成的UUID在您的系统中也是唯一的,因为UUID是全局唯一的。此外,INPUT__FILE__NAME具有相同的长度,不依赖于文件目录结构的长度,并且UUID包含所有的文件路径,这使得文件名在同一文件系统中是唯一的。
这就是为什么UUID是更好的解决方案的原因
发布于 2019-03-11 23:41:56
我会使用内置的SURROGATE_KEYS自定义函数。这比UUID更有优势。当您向表中输入数据时,此函数会自动为您的行生成数字ids,并且执行速度比UUID快。
示例:
1)以默认的ORC格式创建一个具有ACID属性的students表。
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用户定义项创建一个版本的学生表。
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)在代理键上执行快速连接。
(注意:这个示例是从复制过来的,并在这里添加了它,因此即使它的链接被删除,我们也有一个示例可供参考):
在你的表中有一个代理键还有其他的方法。这是关于这个讨论的好帖子。
https://community.hortonworks.com/idea/8619/how-do-we-create-surrogate-keys-in-hive.html
https://stackoverflow.com/questions/55104138
复制相似问题