Sqoop导入数据时添加时间戳字段

浏览: 4086

import


转载请注明出处!


背景说明:当利用Sqoop从Oracle等关系型数据库中抽取数据到Hive或HDFS时,加载到Hive或HDFS的数据需要有一个加载时间戳,以便于后续加载的数据做更新比对。

解决思路

  • 在Sqoop中进行导入时,可以使用–columns来指定导入RDB中表的某些固定字段,试验后发现这种方式在表的字段数较少时是可行的,通过 –columns c1,c2,sysdate来指定,但是当表的字段达到几十个、上百个时,就不是一个好的方法的;
  • 上路不通继续寻找,在Sqoop中还可以使用–query ‘select * from tb where $CONDITIONS’来导入,并且可以指定约束条件,经验证此法可行,Action!

原来的导入

sqoop import --connect jdbc:oracle:thin:@//myOracle:1521/pdbORCL --username mars --password-file mars.pwd --table TBL --null-string '\\N' --null-non-string '\\N' --target-dir /user/hive/warehouse/mars/TBL -m 1

这是全表导入,导入的数据与在Oracle中表的数据是一模一样的,包括表结构和数据

添加时间戳字段的导入

获取当前时间作为Hive或HDFS中的加载时间戳

sqoop import --connect jdbc:oracle:thin:@//myOracle:1521/pdbORCL --username mars --password-file mars.pwd --query "select TBL.*,sysdate from TBL where id > 5 AND \$CONDITIONS" --null-string '\\N' --null-non-string '\\N' --target-dir /user/hive/warehouse/mars/TBL -m 1

几点注意:

  • –query后跟的查询语句可以是单引号引起来,也可以是双引号,无论何种引号都必须加上$CONDITIONS;但当用双引号引用时,必须在$CONDITIONS前加上反斜杠即\$CONDITIONS;
  • 查询中的select语句要按照对应RDB的语法,例如本例中是Oracle的语法去写的,获取当前系统时间作为时间戳,在使用Oracle中的sysdate函数
推荐 3
本文由 MarsJ 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册