背景:
我在sql server上有一个具有以下模式的表。可以更新现有行,并且新行也会添加到此表中。
unique_id | user_id | last_login_date | count
123-111 | 111 | 2016-06-18 19:07:00.0 | 180
124-100 | 100 | 2016-06-02 10:27:00.0 | 50
我使用sqoop在lastmodified模式下添加增量更新。my--check column参数是最后一个登录日期列。在我的第一次运行中,我将上述两条记录放入hadoop中—我们称之为当前数据。我注意到最后一个值(第一次导入的check列的最大值)是2016-06-18 19:07:00.0。
假设sql server端有更改,我现在在sql server端有以下更改:
unique_id | user_id | last_login_date | count
123-111 | 111 | 2016-06-25 20:10:00.0 | 200
124-100 | 100 | 2016-06-02 10:27:00.0 | 50
125-500 | 500 | 2016-06-28 19:54:00.0 | 1
我已经用最近的上次登录日期值更新了第123-111行,计数列也已经更新。我还新增了一行125-500。
在我的第二次运行中,sqoop将查看最后一个登录日期列大于上一次导入的已知最后一个值(2016-06-18 19:07:00.0)的所有列
这只提供更改的数据,即123-111和125-500记录。我们称之为新数据。
问题
如何在hadoop/hive中使用当前数据和新数据进行合并联接,从而得到123-111、124-100和新添加的125-500的更新版本?
2条答案
按热度按时间kiayqfof1#
您可以更改现有的sqoop查询(通过指定新的自定义查询)以从源表获取所有数据,而不是仅获取更改的数据。请参阅使用sqoop将数据移动到配置单元中。这将是实现这一点的最简单方法—即执行完整的数据刷新,而不是应用增量。
dnph8jn42#
使用scoop改变数据负载是一个两阶段的过程。
第一阶段-使用sqoop导入实用程序将更改的数据加载到某个temp(stage)表中。
第二阶段-使用sqoop合并实用程序将更改的数据与旧数据合并。
如果表很小(比如说几个m记录),那么使用sqoop导入使用满负载。
有时可能只加载最新的分区—在这种情况下,使用sqoop import实用程序使用自定义查询加载分区,然后不进行合并—只需将覆盖加载的分区插入目标表或复制文件—这将比sqoop merge工作得更快。