Sqoop常用参数详解与应用
- Sqoop是一个Hadoop和关系型数据库的数据迁移工具(非关系型数据库不支持,hbase除外)
- 官网: http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html#_purpose
- sqoop语句要求写到一行,多行时用\连接
import 常用参数
- sqoop import … --null-string ‘\\N’ --null-non-string ‘\\N’
Sqoop will by default import NULL values as string null. Hive is however
using string \N to denote NULL values and therefore predicates dealing with
NULL (like IS NULL) will not work correctly. You should append parameters
--null-string and --null-non-string in case of import job or --input-null-string
and --input-null-non-string in case of an export job if you wish to properly
preserve NULL values. Because sqoop is using those parameters in
generated code, you need to properly escape value \N to \\N:
- sqoop import … --hive-table xxx
如果不指定--hive-table xxx,则hive默认的表名和来源的表明相同
- sqoop import … --hive-partition-key xxx --hive-partition-value xxx
--hive-partition-key 为创建hive分区表时的分区名称
--hive-partition-value 必须为string类型
- sqoop import … --hive-import
如果未指定任何字段定界符和记录定界符并使用了--hive-import 则默认分隔符为hive创表的默认分隔,字段分隔(^A),记录分隔(\n)
- sqoop import … --hive-overwrite
覆盖hive表中的数据
- sqoop import … --hive-drop-import-delims --hive-delims-replacement xxx
如果数据来源的字符串字段中包含hive的默认定界符(\n和\r字符)或列定界符(\01字符),
则Hive在使用Sqoop导入的数据时会遇到问题。您可以使用该--hive-drop-import-delims选项在
导入时删除这些字符,以提供与Hive兼容的文本数据
或者
可以使用该--hive-delims-replacement选项在导入时用用户定义的字符串替换那些字符,以提供与Hive兼容的文本数据。
仅当使用Hive的默认定界符时,才应使用这些选项;如果指定了不同的定界符,则不应使用这些选项
- sqoop import … --input-fields-terminated-by xxx
指定hive表的字段分隔福
- sqoop import … --input-lines-terminated-by < char>
指定hive表的行尾字符
- sqoop import … --connect < jdbc-uri>
jdbc的连接地址
eg:--connect jdbc:mysql://hadoop111:3306/test
- sqoop import … --driver < class-name>
jdbc连接的驱动类
eg:--driver com.mysql.jdbc.Driver
- sqoop import … --username xxx
远程数据库连接的用户名
- sqoop import … --password xxx
远程数据库连接的密码
- sqoop import … --delete-target-dir
删除向hdfs导入的目标目录(如果存在)
- sqoop import … --target-dir xxxx
指定向hdfs导入的路径
eg: --target-dir hdfs://hadoop111:9000/zxh/test
- sqoop import … --as-textfile(默认) --as-avrodatafile --as-sequencefile --as-parquetfile
将数据导入到某种类型的文件
- sqoop import … -m 或者 --num-mappers < n>
指定map的数量
因为每个map读取的数据量有限,所以当数据量大时,就需要指定多个map了
- sqoop import … --splited-by < column-name>
将原始数据按照某一个列(只能是整形)进行拆分,根据设定的map数拆分,每个map里的数据条数不一定一样,但是范围间隔是一样的
- sqoop import … --check-column < col-name>
指定增量导入数据时要检查的列
(该列的类型不得为CHAR / NCHAR / VARCHAR / VARNCHAR / LONGVARCHAR / LONGNVARCHAR)
- sqoop import … --last-value < value>
指定上一次导入中要检查的列的最大值
- sqoop import … --incremental < mode>
指定增量导入数据的模式,mode有两种 append 和 lastmodified
append导入时,需要指定--check-column,并且只导入检查列的值比--last-value所指定的值大的行
lastmodified导入时,需要指定--check-column的类型只能是timestamp或date,不需要指定--last-value
sqoop import 举例 --从mysql导入到hive表
sqoop import \
--connect "jdbc:mysql://hadoop111:3306/test?useSSL=true&useUnicode=true&characterEncoding=UTF-8" \
--driver com.mysql.jdbc.Driver \
--username root \
--password root \
--table customer \
--delete-target-dir \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
--hive-import \
--hive-overwrite \
--fields-terminated-by '\t' \
--hive-table default.customer \
--splited-by customer_id \
-m 3
export 常用参数
sqoop不支持从hive向mysql直接导数据,只支持从hdfs向mysql导数据
--connect xxx
--driver xxx
--password xxx
--username xxx
--columns xxx
--------------------------------------
上面这几个参数用法和import相同
----------------------------------------
--columns 后面的列值用逗号分隔,未包含在--columns参数中的列需要具有定义的默认值或允许NULL值。
否则,您的数据库将拒绝导入的数据,从而使Sqoop作业失败
- sqoop export … -m < n>
使用n个map任务并行导出
默认情况下,sqoop在导出过程中并行使用四个任务,可以自己调整,来提高导出的性能
- sqoop export … --export-dir < dir>
- sqoop export … --table < table-name>
这是export时两个必须的参数
--export-dir <dir> 指定hdfs导出的源路径
----table <table-name> 指定关系型数据库或者hbase中的表
-
sqoop export … --input-null-string < null-string>
-
sqoop export … --input-null-no-string < null-string>
在--input-null-string和--input-null-non-string参数都是可选的。
如果--input-null-string未指定,则字符串类型列的字符串“ null”将被解释为null。
如果--input-null-non-string未指定,则对于非字符串列,字符串“ null”和空字符串都将解释为null。
注意,除了由所指定的其他字符串外,对于非字符串列,空字符串将始终被解释为null
- sqoop的数据增量导出覆盖问题参考(做数仓基本用不到)、
sqoop export 举例 --从hdfs到出到mysql
sqoop export \
--connect "jdbc:mysql://hadoop111:3306/test?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password root \
--table ali.customer \
-m 2 \
--input-fields-terminated-by '\t' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
--export-dir /user/hive/warehouse/ali.db/customer