**结束。**此问题不符合堆栈溢出准则。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。
11个月前关门了。
改进这个问题
我正在寻找配置单元(1.2.1)中的scd1和scd2实现。我知道在配置单元(0.14)之前加载scd1和scd2表的解决方法。下面是使用变通方法加载scd1和scd2的链接http://hortonworks.com/blog/four-step-strategy-incremental-updates-hive/
既然hive支持acid操作,只想知道是否有更好或直接的加载方法。
5条答案
按热度按时间4xrmg8kj1#
dy1byipe2#
我确实使用了另一种方法来管理数据
SCDs
:永远不要更新历史文件或表中确实存在的数据。
确保新行将与最新生成的行进行比较,例如,加载逻辑将添加控制列:
loaded_on
,checksum
如果需要,在同一天发生多个加载时将使用的序列列,那么将新数据与最新生成的数据进行比较时,将同时使用控制列和存在于数据中的键列(如客户键或产品键)。现在,通过计算
checksum
除了控制列以外的所有相关列中,为每行创建唯一的指纹。指纹(checksum
)列,然后将用于确定与最近一代相比是否有任何列发生了更改(最近一代基于数据的最新状态,基于密钥、加载时间和序列)。现在,您知道来自每日更新的行是否是新的,因为没有上一代,或者来自每日更新的行是否需要在历史文件或表中创建新行(新一代),以及来自每日更新的行是否没有任何更改,因此不需要创建行,因为没有更改与上一代相比没有区别。
所需的逻辑类型可以使用
Apache Spark
,在一份声明中你可以问Spark
连接任意数量的列datatypes
然后计算一个hash
用于指纹的值。现在,您可以基于
spark
这将接受任何数据源,并输出一个组织良好,干净和慢维度意识的历史文件,表格,。。。最后,永远不要只更新附加!lrl1mhuk3#
由于hdfs是不可变的存储,因此可以认为版本化数据和保留历史(scd2)应该是加载维度的默认行为。您可以在hadoopsql查询引擎(hive、impala、drill等)中创建一个视图,使用窗口函数检索当前状态/最新值。你可以在我的博客中找到更多关于hadoop上维度模型的信息,例如如何处理大维度和事实表。
qni6mghb4#
嗯,我用两个临时表来解决这个问题:
smdnsysy5#
下面是使用独占连接方法在配置单元中缓慢更改维度类型2的详细实现。
假设源正在发送一个完整的数据文件,即旧的、更新的和新的记录。
将最近的文件数据加载到stg表
从hist表中选择所有过期的记录
select * from HIST_TAB where exp_dt != '2099-12-31'
使用内部联接和hist.column=stg.column上的过滤器,从stg和hist中选择所有未更改的记录,如下所示select hist.* from HIST_TAB hist inner join STG_TAB stg on hist.key = stg.key where hist.column = stg.column
选择所有新的和更新的记录,这些记录是从stg\u选项卡使用独占左连接hist\u选项卡更改的,并设置到期和生效日期,如下所示select stg.*, eff_dt (yyyy-MM-dd), exp_dt (2099-12-31) from STG_TAB stg left join (select * from HIST_TAB where exp_dt = '2099-12-31') hist on hist.key = stg.key where hist.key is null or hist.column != stg.column
使用exclusive left join with stg table从hist表中选择所有更新的旧记录,并设置其到期日期,如下所示:select hist.*, exp_dt(yyyy-MM-dd) from (select * from HIST_TAB where exp_dt = '2099-12-31') hist left join STG_TAB stg on hist.key= stg.key where hist.key is null or hist.column!= stg.column
unionall
从2-5查询并将覆盖结果插入hist表更详细的scd类型2的实现可以在这里找到-
https://github.com/sahilbhange/slowly-changing-dimension