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函数