【问题标题】:Is it okay to use UUID as Surrogate Key for a datawarehouse in hive?可以使用 UUID 作为 Hive 中数据仓库的代理键吗?
【发布时间】:2019-03-11 14:29:43
【问题描述】:

为了在我们的 hive 数据仓库中实现代理键,我将选择范围缩小到 2 个:

1) 反射('java.util.UUID','randomUUID') 2) INPUT__FILE__NAME + BLOCK__OFFSET__INSIDE__FILE

以上哪个是更好的选择?

或者你会推荐一个更好的?

谢谢。

【问题讨论】:

    标签: hive uuid


    【解决方案1】:

    对于 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 是更可取的解决方案

    【讨论】:

      【解决方案2】:

      我会使用内置的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

      【讨论】:

      • 我之前确实尝试过,但 Hive 一直在抱怨 DEFAULT 和 SURROGAT_KEY() 的语法。我正在使用 Hive 1.2.0。谢谢。
      • 这是 Hive 3.x 功能 (HDP 3.1.0)
      猜你喜欢
      • 2017-09-27
      • 2018-06-05
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      相关资源
      最近更新 更多