代理键是如何在 hive 中处理的

Posted

技术标签:

【中文标题】代理键是如何在 hive 中处理的【英文标题】:How surrogate keys are handles in hive 【发布时间】:2018-08-12 04:01:36 【问题描述】:

我知道 hive 不能创建代理键或者相当困难。我想了解公司如何在其仓库中实施维度建模。

我能想到的一种方法是保留维度细节。然后将不同的维度移动到不同的表中。但是然后如何处理scd1和scd2。我检查了 Kimball 在 cloudera 上的谈话,但我仍然不明白这是如何工作的。

【问题讨论】:

公司如何在他们的仓库中实施维度建模 在非 Hive 仓库中,例如 SQL Server,您只需使用 identity 【参考方案1】:

在 Hive 中有两种处理这个问题的方法。

第一个没有直接回答你的问题,那就是使用自然键而不是代理。虽然代理更方便且性能更高,但由于您使用的是 Hive,我猜性能不是您的主要标准之一,因此使用自然键的成本只是您必须编写的额外代码行满足复合键。

第二种方法是使用 Hive 的窗口函数来计算代理项。我没有方便测试此查询的 Hive 环境,但代理项看起来像:

(select max(surrogate_key_column) from dimension_table)
+ row_number() over (order by 1)

【讨论】:

可以的。但我想知道你们是否在他们的公司中实施这一点。您在工作中使用第二种方法吗?如果我们从多个表中创建事实,那么使用 NK 方法也不起作用。 NK 将重叠。 我没有在 Hive 中使用过这种方法,但我已经在其他数据仓库环境中广泛使用了它。我不明白为什么多个表会阻止使用自然键......当然,例如,Table1 中的 CustomerA 与 Table2 中的 CustomerA 相同?如果不是,那么自然键也应该包含单独的表所代表的概念。如果您可以分享有关您的表格的更多详细信息,这将有助于更好地理解问题。【参考方案2】:

据我所知,在 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;

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 感谢您的所有评论和编辑,@slideshowp2,尼克。我会在下一个答案中改进。

以上是关于代理键是如何在 hive 中处理的的主要内容,如果未能解决你的问题,请参考以下文章

如何在所有可用节点中运行 Hive mapreduce 任务?

如何在Hive中进行数据压缩以实现高效存储?

从 Hive 元存储(parquet 格式)在 Spark 中本地处理 10 亿条记录需要 6 个小时。如何加快速度?

如何获取基于 HIVE-SQOOP 的批处理作业的异常、错误和日志?

如何在 Hive 中为批处理数据创建分层分区

如何在使用 EMR/Hive 将数据从 S3 导入 DynamoDB 时处理包含在引号 (CSV) 中的字段