用sqoop将oracle数据导入Hive

来源:互联网 发布:俄罗斯海军知乎 编辑:程序博客网 时间:2024/06/06 20:57

创建 hive 表

生成与关系数据库表的表结构对应的HIVE表:

$ sqoop create-hive-table --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS 
参数说明--hive-home <dir>Hive的安装目录,可以通过该参数覆盖掉默认的hive目录--hive-overwrite覆盖掉在hive表中已经存在的数据--create-hive-table默认是false,如果目标表已经存在了,那么创建任务会失败--hive-table后面接要创建的hive表--table指定关系数据库表名

 导入数据到 hive

执行下面的命令会将 mysql 中的数据导入到 hdfs 中,然后创建一个hive 表,最后再将 hdfs 上的文件移动到 hive 表的目录下面。

sqoop import --connect jdbc:oracle:thin:@219.216.110.120:1521:orcl --username TEST1 --password test1 --table TEST1 --fields-terminated-by '\t' --hive-import --hive-overwrite  --hive-table test1_test1

说明:

  • 可以在 hive 的表名前面指定数据库名称
  • 可以通过 --create-hive-table 创建表,如果表已经存在则会执行失败

另外,Sqoop 默认地导入空值(NULL)为 null 字符串,而 hive 使用 \N 去标识空值(NULL),故你在 import 或者 export 时候,需要做相应的处理。在 import 时,使用如下命令:

$ sqoop import  ... --null-string '\\N' --null-non-string '\\N'

在导出时,使用下面命令:

$ sqoop import  ... --input-null-string '' --input-null-non-string ''

一个完整的例子如下:

$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by "\t" --lines-terminated-by "\n" --hive-import --hive-overwrite --create-hive-table --hive-table dw_srclog.TBLS --null-string '\\N' --null-non-string '\\N' --compression-codec "com.hadoop.compression.lzo.LzopCodec"

 增量导入

如果我们要导入某个表中的新加入的部分,可以使用--check-column、--incremental、--last-value三个参数,--check-column指定要检查的列,--incremental指定某种增加的模式,只有两个合法的值,append 和lastmodified。如果--incremental为append,则Sqoop会导入--check-column指定的列的值大于--last-value所指定的值的记录。如果--incremental为lastmodified,则Sqoop会导入--check-column指定的列的值(这是一个时间戳)近于--last-value所指定的时间戳的记录

参数说明--check-column (col)指定一个“标志列”用于判断增量导入的数据范围,该列不能是字符型,最好是数字或者日期型。如id--incremental (mode)append:追加,比如对大于last-value指定的值之后的记录进行追加导入。lastmodified:最后的修改时间,追加last-value指定的日期之后的记录--last-value (value)指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一值增量导入示例

sqoop import --connect jdbc:oracle:thin:@219.216.110.120:1521:orcl --username TEST1 --password test1 --table TEST1 --fields-terminated-by '\t' --hive-import --hive-table test1_test1 --check-column id --incremental append --last-value 4


增量job的创建和执行   
创建增量更新job:
fulong@FBI006:~/Sqoop/sqoop-1.4.4/bin$ sqoop job --create incretest -- import --connect jdbc:Oracle:thin:@192.168.0.138:1521:orcl  --username HIVE --password hivefbi --table FBI_SQOOPTEST --hive-import --hive-table INCRETEST --incremental lastmodified --check-column LASTMODIFIED --last-value '2014/8/27 13:00:00'
14/08/27 17:29:37 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
14/08/27 17:29:37 INFO tool.BaseSqoopTool: Using Hive-specific delimiters for output. You can override
14/08/27 17:29:37 INFO tool.BaseSqoopTool: delimiters with --fields-terminated-by, etc.
14/08/27 17:29:37 WARN tool.BaseSqoopTool: It seems that you've specified at least one of following:
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --hive-home
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --hive-overwrite
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --create-hive-table
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --hive-table
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --hive-partition-key
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --hive-partition-value
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --map-column-hive
14/08/27 17:29:37 WARN tool.BaseSqoopTool: Without specifying parameter --hive-import. Please note that
14/08/27 17:29:37 WARN tool.BaseSqoopTool: those arguments will not be used in this session. Either
14/08/27 17:29:37 WARN tool.BaseSqoopTool: specify --hive-import to apply them correctly or remove them
14/08/27 17:29:37 WARN tool.BaseSqoopTool: from command line to remove this warning.
14/08/27 17:29:37 INFO tool.BaseSqoopTool: Please note that --hive-home, --hive-partition-key,
14/08/27 17:29:37 INFO tool.BaseSqoopTool:       hive-partition-value and --map-column-hive options are
14/08/27 17:29:37 INFO tool.BaseSqoopTool:       are also valid for HCatalog imports and exports
 
执行Job:
fulong@FBI006:~/Sqoop/sqoop-1.4.4/bin$ ./sqoop job --exec incretest
 
注意日志中显示的SQL语句:
14/08/27 17:36:23 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(ID), MAX(ID) FROM FBI_SQOOPTEST WHERE ( LASTMODIFIED >= TO_DATE('2014/8/27 13:00:00', 'YYYY-MM-DD HH24:MI:SS') AND LASTMODIFIED < TO_DATE('2014-08-27 17:36:23', 'YYYY-MM-DD HH24:MI:SS') )
其中,LASTMODIFIED的下界是创建job的语句中指定的,上界是当前时间2014-08-27 17:36:23
 
验证:
hive> select * from incretest;
OK
2       lion    2014-08-27
Time taken: 0.085 seconds, Fetched: 1 row(s)
 
然后我向Oracle中插入一条数据:
 
 
再执行一次:
fulong@FBI006:~/Sqoop/sqoop-1.4.4/bin$ ./sqoop job --exec incretest
 
日志中显示的SQL语句: 
14/08/27 17:47:19 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(ID), MAX(ID) FROM FBI_SQOOPTEST WHERE ( LASTMODIFIED >= TO_DATE('2014-08-27 17:36:23', 'YYYY-MM-DD HH24:MI:SS') AND LASTMODIFIED < TO_DATE('2014-08-27 17:47:19', 'YYYY-MM-DD HH24:MI:SS') )
其中,LASTMODIFIED的下界上一次执行该job的上界,也就是说,Sqoop的“Saved Jobs”机制对于增量导入类Job,自动记录了上一次的执行时间,并自动将该时间赋值给下一次执行的--last-value参数!也就是说,我们只需要通过crontab设定定期执行该job即可,job中的--last-value将被“Saved Jobs”机制自动更新以实现真正意义的增量导入。
 
以上Oracle表中新增的数据被成功插入Hive表中。





0 0
原创粉丝点击