我知道 hive 无法创建代理键或相当困难。我想了解公司如何在仓库中实施维度建模。
我能想到的一种方法是保持尺寸细节不变。然后将非重复维度移动到其他表。但是如何处理 scd1 和 scd2。我已经查看了Kimball在cloudera上的演讲,但我仍然不明白这是如何工作的。
在 Hive 中有两种方法可以处理此问题。
第一个不直接回答你的问题,那就是使用自然键而不是代理项。虽然代理项更方便、性能更高,但由于您使用的是 Hive,我猜性能不是您的主要标准之一,因此使用自然键的成本将只是您必须编写的额外代码行以满足复合键。
第二种方法是使用 Hive 的窗口函数来计算代理项。我没有方便的 Hive 环境来测试此查询,但代理项如下所示:
(select max(surrogate_key_column) from dimension_table)
+ row_number() over (order by 1)
据我所知,在 3.0 版中,Hive 支持 ACID 表上的代理键
https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.1.4/using-hiveql/content/hive_surrogate_keys.html
从链接总结:
SURROGATE_KEY UDF 会为您插入到表中的每一行生成唯一的 Id。
用法示例:
-创建表格
CREATE TABLE students_v2
(`ID` BIGINT DEFAULT SURROGATE_KEY(),
row_id INT,
name VARCHAR(64),
dorm INT,
PRIMARY KEY (ID) DISABLE NOVALIDATE);
-插入数据,这将自动生成主键的代理键。
INSERT INTO students_v2 (row_id, name, dorm) SELECT * FROM students;
-看看代理键。
SELECT * FROM students_v2;