在 apache hive 的维度表中有一个代理键或 nk+effective_time 更好吗

Is it better to have a surrogate key or nk+effective_time in dimension tables in apache hive

比方说,有一个 SCD2 维度 table - 位置。自然键是国家、州和城市的组合。由于是SCD2table,eff date也是key的一部分

将代理键设置为 usavirginarichmond20110101 还是在配置单元中使用 row_number() 创建一个实际的数字键更好?

为什么一种方法优于另一种方法?

您可以按 effective_date 进行分区以便更快 filtering/joining 只有分区只有有效日期。 像 usavirginarichmond20110101 这样的代理键会给你什么?全面扫描,因为过滤将在 substr 上进行。因此,将 country, state, city and effective_date 单独作为键并按 effective_date 进行分区。

还有一点很重要:在 hive 中使用 row_number() 的数字键不是好的解决方案,因为它的生成是 运行 而不是分布式模式。为此最好使用 GUID。

(术语说明:自然键的组合称为 "composite key",不是代理键,它仍然是 "natural key"。代理键(又名合成键)是一个顺序整数,没有商业意义)。

简短回答:因为你的维度是 SCD2,所以一定要使用 surrogate/synthetic 键。使用 natural/composite 键处理 SCD 很痛苦。

更长的答案: 代理(SK)与自然键(NK)设计是一个持续的争论。每个都有优点和缺点。我的方法是 总是 在数据仓库 (DW) 中使用代理键。这意味着一些额外的 ETL 工作,但这是一个 acceptable 成本,因为代理键有一些重要的优势:

  1. SCD 处理更容易。如果你有 SCD,使用自然键会相当麻烦和丑陋。合成键没有问题;

  2. 系统范围的一致性:由于 SCD,您很可能至少在某些 table 中必须在数据仓库中使用 SK。在所有 table 中始终使用它们是有意义的。混合 SK 和 NK 设计是丑陋的;

  3. 复合 NK 通常可以是大而复杂的字母数字字符串。这意味着它们可能会显着增加 table 大小,并且连接可能会变慢。 SK 是一个简单的整数,具有 predictable 大小和一致的连接速度;

  4. NK 可能是 DW 中错误和不稳定的来源。例如,一些数据库重复使用它们的自然键,因此它们的含义可能会随着时间而改变。在依赖 NK 的 DW 中,这是一场潜在的灾难。此外,NK 可能来自各种来源,并导致整合冲突。

还有其他考虑因素,但根据我的经验,系统地使用代理键可以使 DW 设计更加可靠和高效。