sqoop(一)数据库数据导入hive
将达梦数据库数据导入到hive
将达梦数据库的驱动放到sqoop安装路径下的lib路径下(其他数据库同样操作)
sqoop命令是:
sqoop import --driver dm.jdbc.driver.DmDriver --connect \
jdbc:dm://192.168.xx.xx:xxxx/METACENTER \
--username XXXXX \
--password xxxxx \
--query "select * from case_type where \$CONDITIONS" \
--hive-import \
--create-hive-table \
--target-dir /software/hadoop3.1.3/hadoop-3.1.3/to_case_type/ \
--hive-database demo \
--hive-table to_case_type \
--fields-terminated-by ',' \
--delete-target-dir \
-m 1
导入命令中参数的介绍:
--driver 手动指定要使用的JDBC驱动程序类,如果是mysql,oracle,dbserver,postgresql等数据库,则不用指定
--connect 用来指定数据库的URL连接
--username 数据库的登录用户
--password 数据库的登录密码
--password-file 将密码存储到文件,然后去文件中获取数据库的连接密码
--query或者--e 将查询结果的数据导入,使用时必须伴随参--target-dir,--hive-table,
如果查询中有where条件,则条件后必须加上$CONDITIONS关键字
--where 从关系数据库导入数据时的查询条件
--table 用来指定查询的关系型数据库的数据表,与--query有一个即可
--hive-import 将数据从关系数据库中导入到hive表中
--create-hive-table 默认是false,即,如果目标表已经存在了,那么创建任务失败。
--hive-table 后面接要创建的hive表,默认使用MySQL的表名
--hive-database 指定要导入到hive中的指定的库中
--fields-terminated-by 设定每个字段是以什么符号作为结束,默认为逗号
--target-dir 指定HDFS路径
--delete-target-dir 判断HDFS路径是否存在,如果存在,则先删除
--m或–-num-mappers 启动N个map来并行导入数据,默认4个。(数量设置最好不大于节点的数量)
--split-by 用于分割工作单元的表的列,建议选择数字类型的数据列,且数据量的分布尽可能的均匀,一般用来与--m搭配使用
--direct 如果数据库存在直接连接器,请使用直接连接器
--incremental append 用来指定以追加的方式对数据库进行增量抽取
--check-column 用来指定进行增量校验的字段,一般指定为数字类型或者时间类型等可以进行大小比较的字段类型
--last-value 该值是用来作为第一次导入的下界,从第二次开始,sqoop会自动更新该值为上一次导入的上界。也就是说第一做更新的时候一般是全量导入,
第二次执行增量的时候是会把>第一次初始的值增量进去,并记录第二次最大的值。
--hive-drop-import-delims 删除string字段内的特殊字符,如果Hive使用这些字符作为分隔符,hive的字段会解析错误、出现错位的情况。
它的内部是用正则表达式替换的方式把\n, \r, \01替换成""
--hive-delims-replacement 将Hive记录\0x01和行分隔符(\n\r)从导入的字符串字段替换为用户定义的字符串
在运行时遇到的错误
1.java.io.IOException: No manager for connect string: jdbc:dm://xxxxx:port
原因是数据库连接url或者是没有指定相关的驱动类
检查是否引入了数据库的连接驱动,数据库的url拼写是否正确,以及是否指定了--driver
参数。
2.在使用–password-file 时,一直报数据库用户名或密码不对。
原因是因为在Linux系统中,vim写文件时,会自动在文件的最后加上一个换行符,而sqoop并不会忽略末尾的换行符,所以会将含有换行符的密码提交给数据库,导致访问失败。所以可以用
echo -n "your_mysql_password" > /home/xxx/.mysql.password
来避免换行符的存在,或者在windows环境下创建好文件之后,再上传到服务器上。