sqoop Mysql 导入到hdfs、hive

sqoop是一个用于在Hadoop和关系型数据库(Oracle,Mysql...)间数据传递的开源工具。下面以mysql、sqlserver为例,介绍使用sqoop将数据从mysql、sqlserver导入到Hadoop中(HDFS、Hive)

#导入命令及参数介绍

通用参数

参数名

参数说明

--connect <jdbc-uri> JDBC连接字符串
--username <username> 数据库用户名
--password <password> 数据库密码
-P 导入时,从控制台获取数据库密码
--password-file 从指定的文件中获取数据库密码
--verbose 导入时,输出更多的日志信息

 

 控制参数

参数说明
–append 将数据追加到hdfs中已经存在的dataset中。使用该参数,sqoop将把数据先导入到一个临时目录中,然后重新给文件命名到一个正式的目录中,以避免和该目录中已存在的文件重名。
–as-avrodatafile 将数据导入到一个Avro数据文件中
–as-sequencefile 将数据导入到一个sequence文件中
–as-textfile 将数据导入到一个普通文本文件中,生成该文本文件后,可以在hive中通过sql语句查询出结果。
–boundary-query 边界查询,也就是在导入前先通过SQL查询得到一个结果集,然后导入的数据就是该结果集内的数据,格式如:–boundary-query ‘select id,no from t where id = 3’,表示导入的数据为id=3的记录,或者 select min(), max() from ,注意查询的字段中不能有数据类型为字符串的字段,否则会报错
–columns<col,col> 指定要导入的字段值,格式如:–columns id,username
–direct 直接导入模式,使用的是关系数据库自带的导入导出工具。官网上是说这样导入会更快
–direct-split-size 在使用上面direct直接导入的基础上,对导入的流按字节数分块,特别是使用直连模式从PostgreSQL导入数据的时候,可以将一个到达设定大小的文件分为几个独立的文件。
–inline-lob-limit 设定大对象数据类型的最大值
-m,–num-mappers 启动N个map来并行导入数据,默认是4个,最好不要将数字设置为高于集群的节点数
–query,-e 从查询结果中导入数据,该参数使用时必须指定–target-dir、–hive-table,在查询语句中一定要有where条件且在where条件中需要包含 \$CONDITIONS,示例:–query ‘select * from t where \$CONDITIONS ‘ –target-dir /tmp/t –hive-table t
–split-by 表的列名,用来切分工作单元,一般后面跟主键ID
–table 关系数据库表名,数据从该表中获取
–delete-target-dir 删除目标目录
–target-dir 指定hdfs路径
–warehouse-dir 与 –target-dir 不能同时使用,指定数据导入的存放目录,适用于hdfs导入,不适合导入hive目录
–where 从关系数据库导入数据时的查询条件,示例:–where “id = 2”
-z,–compress 压缩参数,默认情况下数据是没被压缩的,通过该参数可以使用gzip压缩算法对数据进行压缩,适用于SequenceFile, text文本文件, 和Avro文件
–compression-codec Hadoop压缩编码,默认是gzip
–null-string 可选参数,如果没有指定,则字符串null将被使用
–null-non-string 可选参数,如果没有指定,则字符串null将被使用
--fields-terminated-by  自定义行分隔符
--lines-terminated-by  自定义列分割符
--hive-drop-import-delims 把导入数据中包含的hive默认的分隔符去掉

##导入数据到HDFS

##Mysql作为元数据
$ sqoop import --connect jdbc:mysql://IP:PORT/ --username USER --password 'PASSWD' --table T_SQOOP_TEST --where "$conditions" --target-dir 'mydir' --delete-target-dir


##SqlServer作为元数据
$ sqoop import --connect 'jdbc:sqlserver://IP:1433;username=NAME;password=PWD;database=DataName' --table T_SQOOP_TEST --where “$conditions” --target-dir 'mydir' --delete-target-dir

###导入到hive

在导入命令中添加--hive-import参数则将数据导入到hive中
$ sqoop import --hive-import --connect jdbc:mysql://IP:PORT/ --username USER --password 'PASSWD' --table T_SQOOP_TEST --m 1--target-dir 'mydir' --delete-target-dir
参数说明:

参数名

参数说明

--hive-import 数据导入到Hive
--hive-overwrite 覆盖Hive表中已存在的数据
--create-hive-table 设置了此参数,导入时如果hive中表已经存在,则导入任务失败。默认为false
--hive-table <table-name> 指定导入到Hive中的表名
--hive-drop-import-delims 导入Hive时,去除字符型字段中的\n(换行符),\r(回车符)和\01(标题开始符)字符。
--hive-delims-replacement 导入Hive时,用用户定义的字符串替换字符型字段中的\n,\r和\01字符。
 
导入时需要注意
1)Hive默认使用\01字符作为列分隔符(字段分隔符),\n和\r作为行分隔符。因此,如果导入的字符型字段的数据中包含这些字符时,就会有问题。
如:T_SQOOP_TEST表ID为2的行,NAME字段值中包含换行符,导入到Hive中,数据出现异常:
可以使用--hive-drop-import-delims参数,将导入数据中的\n,\r,\01字符去掉。也可以使用--hive-delims-replacement替换\n,\r和\01。
原文地址:https://www.cnblogs.com/GuoSamael/p/8023763.html