可以使用uuid作为配置单元中数据仓库的代理密钥吗?

esbemjvw  于 2021-06-27  发布在  Hive
关注(0)|答案(2)|浏览(478)

为了在我们的hive数据仓库中实现代理密钥,我将范围缩小到2个选项:
1) reflect('java.util.uuid','randomuuid')2)在\u文件中输入\u文件\u名称+块\u偏移量\u
以上哪一项是更好的选择?
或者你能推荐一个更好的吗?
谢谢您。

brjng4g3

brjng4g31#

用于orc和序列文件 BLOCK__OFFSET__INSIDE__FILE 不是每个文件唯一的,官方文档说它是当前块的第一个字节的文件偏移量
在internet上的一些资源中,据说块\偏移\在\文件中是唯一的,在文本文件中是唯一的。即使这是真的,你为什么要限制自己的文本文件只。
此外,uuid不依赖于输入文件,可以在一些转换后计算,在一个工作流中阅读kaffka主题,完全没有文件,等等,在其他一些系统中生成的uuid在您的系统中也是唯一的,因为uuid是全局唯一的。而且uuid的长度相同,不依赖于文件目录结构的长度,并且 INPUT__FILE__NAME 包含所有文件路径,这使文件名在同一文件系统中唯一。
这就是为什么uuid是更好的解决方案

rsl1atfo

rsl1atfo2#

我会使用内置的 SURROGATE_KEYS 自定义项。这比uuid有优势。当您在表中输入数据时,这个函数会自动为您的行生成数字id,并且执行速度比uuid快。
例子:
1) 以具有acid属性的默认orc格式创建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) 使用代理键udf创建students表的版本。

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\u 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文档中复制的,并将其添加到此处,因此即使删除了它的链接,我们也有一个示例可供参考):
还有其他方法可以在表中使用代理键。这是讨论的好线索。
https://community.hortonworks.com/idea/8619/how-do-we-create-surrogate-keys-in-hive.html

相关问题