我来自SQL Datawarehouse世界,从平面Feed我生成维度和事实表。在一般数据仓库项目中,我们将Feed分为事实和维度。例如:
我是Hadoop的新手,我开始知道我可以在hive中构建数据仓库。现在,我熟悉使用guid,我认为它适用于蜂巢中的主键。那么,下面的策略是在hive中加载事实和维度的正确方法吗?
从sales_data_warehouse生成维度;例如:
从Sales_Data_Warehouse中选择New_Guid(),Customer_Name,Customer_Address
完成所有维度后,加载事实表,如
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 .....
这是我应该在hive中加载我的事实和维度表的方式吗?
此外,在一般仓库项目中,我们需要更新维度属性(例如:Customer_Address更改为其他内容)或者必须更新事实表外键(很少,但确实会发生)。那么,如何在hive中加载INSERT-UPDATE。 (就像我们在SSIS中查找或在TSQL中使用MERGE语句一样)?
答案 0 :(得分:1)
我们仍然可以在Hadoop和Hive上获得维度模型的好处。但是,Hadoop的一些功能要求我们稍微采用标准的维度建模方法。
Hadoop文件系统是不可变的。我们只能添加但不能更新数据。因此,我们只能将记录附加到维度表(虽然Hive已添加了更新功能,但事务似乎相当错误)。在Hadoop上缓慢更改维度成为默认行为。为了获得维度表中的最新和最新记录,我们有三个选项。首先,我们可以创建一个使用窗口函数检索最新记录的View。其次,我们可以在后台运行压缩服务,重新创建最新状态。第三,我们可以将维度表存储在可变存储中,例如, HBase和联合查询跨两种类型的存储。
数据在HDFS中的分布方式使得加入数据变得非常昂贵。在分布式关系数据库(MPP)中,我们可以在群集中的同一节点上将相同的主键和外键共存。这使得加入非常大的表相对便宜。没有数据需要通过网络传输以执行连接。这在Hadoop和HDFS上非常不同。在HDFS上,表被拆分为大块,并分布在集群中的节点上。我们无法控制各个记录及其密钥如何在群集中传播。因此,在Hadoop上连接两个非常大的表非常昂贵,因为数据必须通过网络传输。我们应尽可能避免加入。对于大型事实和维度表,我们可以将维度表直接去规范化到事实表中。对于两个非常大的事务表,我们可以将子表的记录嵌套在父表中,并在运行时将数据展平。我们可以在BigQuery / Postgres等中使用SQL扩展(如array_agg)来处理事实表中的多个粒度
我还会质疑代理键的用处。为什么不使用自然键?也许复杂复合键的性能可能是一个问题,但是替代密钥并不是真正有用的,我从不使用它们。