用于在我们的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