在 hive 中生成星型模式

Generating star schema in hive

我来自 SQL 数据仓库世界,我从平面提要​​生成维度和事实 tables。在一般的数据仓库项目中,我们将提要分为事实和维度。例如:

我对Hadoop完全陌生,我开始知道我可以在hive中构建数据仓库。现在,我熟悉使用 guid,我认为它适用于配置单元中的主键。那么,下面的策略是在 hive 中加载事实和维度的正确方法吗?

  1. 将源数据加载到配置单元中table;让我们说 Sales_Data_Warehouse
  2. 从 sales_data_warehouse 生成维度;例如:

    SELECT New_Guid(), Customer_Name, Customer_Address 从 Sales_Data_Warehouse

  3. 完成所有维度后加载事实 table 喜欢

    SELECT New_Guid() AS 'Fact_Key', Customer.Customer_Key, Store.Store_Key... 从 Sales_Data_Warehouse 到 'source' 在 source.Customer_Name = 上加入 Customer_Dimension 客户 Customer.Customer_Name 和 source.Customer_Address = Customer.Customer_Address JOIN Store_Dimension AS 'Store' ON Store.Store_Name = Source.Store_Name JOIN Product_Dimension AS 'Product' ON .....

这是我在配置单元中加载事实和维度 table 的方式吗?

此外,在一般仓库项目中,我们需要更新维度属性(例如:Customer_Address 更改为其他内容)或者必须更新事实 table 外键(很少,但确实会发生) ).那么,我怎样才能在配置单元中加载 INSERT-UPDATE。 (就像我们在 SSIS 中执行查找或在 TSQL 中执行 MERGE 语句一样)?

我们仍然可以从 Hadoop 和 Hive 上的维度模型中获益。然而,Hadoop 的某些特性要求我们稍微采用标准方法进行维度建模。

Hadoop 文件系统是 immutable。我们只能添加但不能更新数据。因此,我们只能将记录附加到维度 tables(虽然 Hive 添加了更新功能和事务,但这似乎有很多错误)。 Slowly Changing Dimensions 在 Hadoop 上成为默认行为。为了获得维度 table 中最新和最新的记录,我们有三个选项。首先,我们可以创建一个使用窗口函数检索最新记录的视图。其次,我们可以在后台提供压缩服务 运行ning 来重新创建最新状态。第三,我们可以将维度 tables 存储在 mutable 存储中,例如跨两种存储类型的 HBase 和联邦查询。

数据在 HDFS 中的分布方式使得连接数据的成本很高。在分布式关系数据库 (MPP) 中,我们可以将具有相同主键和外键的记录放在集群中的同一节点上。这使得加入非常大的 tables 相对便宜。没有数据需要通过网络传输来执行连接。这在 Hadoop 和 HDFS 上是非常不同的。在 HDFS 上,tables 被分成大块并分布在我们集群上的节点上。我们无法控制单个记录及其密钥如何在集群中传播。因此,在 Hadoop 上连接两个非常大的 table 非常昂贵,因为数据必须通过网络传输。我们应该尽可能避免连接。对于一个大的事实和维度 table,我们可以将维度 table 直接反规范化为事实 table。对于两个非常大的事务 table,我们可以将子 table 的记录嵌套在父 table 中,并在 运行 时展平数据。我们可以使用 SQL 扩展,例如 array_agg in BigQuery/Postgres 等来处理事实中的多个 grains table

我还会质疑代理键的用处。为什么不用自然键呢?也许复杂复合键的性能可能是个问题,但否则代理键并不是很有用,我从不使用它们。