在配置单元中生成星型模式

时间:2017-03-28 12:59:05

标签: hadoop hive data-warehouse dimensional-modeling fact

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

enter image description here

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

  1. 将源数据加载到配置单元表中;比方说Sales_Data_Warehouse
  2. 从sales_data_warehouse生成维度;例如:

    从Sales_Data_Warehouse中选择New_Guid(),Customer_Name,Customer_Address

  3. 完成所有维度后,加载事实表,如

    SELECT New_Guid()AS'Fact_Key',Customer.Customer_Key,Store.Store_Key ...    来自Sales_Data_Warehouse AS'来源'    在source.Customer_Name =上加入Customer_Dimension Customer    Customer.Customer_Name AND source.Customer_Address = Customer.Customer_Address    加入Store_Dimension AS'Store'ON    Store.Store_Name = Source.Store_Name    加入Product_Dimension AS'Product'ON .....

  4. 这是我应该在hive中加载我的事实和维度表的方式吗?

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

1 个答案:

答案 0 :(得分:1)

我们仍然可以在Hadoop和Hive上获得维度模型的好处。但是,Hadoop的一些功能要求我们稍微采用标准的维度建模方法。

Hadoop文件系统是不可变的。我们只能添加但不能更新数据。因此,我们只能将记录附加到维度表(虽然Hive已添加了更新功能,但事务似乎相当错误)。在Hadoop上缓慢更改维度成为默认行为。为了获得维度表中的最新和最新记录,我们有三个选项。首先,我们可以创建一个使用窗口函数检索最新记录的View。其次,我们可以在后台运行压缩服务,重新创建最新状态。第三,我们可以将维度表存储在可变存储中,例如, HBase和联合查询跨两种类型的存储。

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

我还会质疑代理键的用处。为什么不使用自然键?也许复杂复合键的性能可能是一个问题,但是替代密钥并不是真正有用的,我从不使用它们。

相关问题