参数说明
--connect #关系型数据库连接
--username #关系型数据库连接用户名
--password #关系型数据库连接密码
--table #关系型数据库的表
--columns #查询哪些列
--mapreduce-job-name #hadoop作业job运行的名称
-m #指定MapReduce中map数量(并行度),也是生成的hdfs文件的数量
导入没有主键的表使用,如果-m为1可以不指定,否则必须加上此参数,且最好是数值类型
--split-by
--direct #快速模式,可提高抽取的性能,使用数据库自带的mysqldump导出数据,有些数据库版本不支持 (不要盲目使用)
注意以下几个问题:
- 【WARN manager.DirectMySQLManager: Direct-mode import from MySQL does not support column】direct方式仅仅支持所有的列 有column的话direct就无效了
- 【Error: java.io.IOException: Cannot run program “mysqldump”: error=2, No such file or directory】 需要把mysqldump复制到从节点:
scp /usr/bin/mysqldump cm-slave1:/usr/bin/
- 使用direct会使得–null-non-string –null-string无效
- 还有些坑,如 主键id搞没了,搞成null、NULL
https://blog.csdn.net/qq_33792843/article/details/90792702
--null-string #当string类型的字段,值为NULL,替换成指定的字符
--null-non-string #当非string类型的字段,值为NULL,替换成指定字符
--delete-target-dir #如果hdfs的目录已经存在则先删除
--target-dir #导入到hdfs时的目标目录
--export-dir #从hdfs导出时的源目录
--fields-terminated-by #导入到hdfs时的hdfs文件分隔符
--input-fields-terminated-by #从hdfs导出时的hdfs文件分隔符
追加数据相关的参数
注意:1 每追加成功一次,会在 target-dir 目录新添加一个文件
2 append和delete-target-dir是相互冲突的,不能同时存在
--incremental append #追加模式
--check-column #检查新追加数据的列名
--last-value #成功导入Hadoop的最后一个值。将导入此值之后的所有新添加的数据。
--hive-drop-import-delims #导入hive中的数据某列中如果有换行符或回车键可以删除
--hive-database #hive的数据库
--create-hive-table 自动创建hive表,初次导入使用
--hive-table #hive的表
--hive-overwrite #覆盖之前的数据
--hive-partition-key #hive分区字段
--hive-partition-value #hive分区值
导入mysql中的指定表数据到HDFS上
sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/linshi_1 \
--username root \
--password 123456 \
--table message \
--target-dir /user/oozie/oozie_test/dir5 \
--fields-terminated-by '\t' \ (列分隔字符串)
--m 2 (指定map进程数)
导入mysql中的指定表数据到HDFS上,有where条件
sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/linshi_1 \
--username root \
--password 123456 \
--table message \
--where "g_qq<>''" \ (where条件)
--target-dir /user/oozie/oozie_test/dir14 \
--fields-terminated-by ',' \
--m 1
导入mysql中的指定表数据到HDFS上,查询指定列
sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/linshi_1 \
--username root \
--password 123456 \
--table message \
--columns "ID,g_reversion,g_brow,g_title,g_man" \ (查询指定列)
--target-dir /user/oozie/oozie_test/dir15 \
--fields-terminated-by ',' \
--m 1
使用自定义sql语句导入数据到HDFS上
sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/linshi_1 \
--username root \
--password 123456 \
--query 'SELECT a.l_id,a.l_title,a.c_title FROM article AS a INNER JOIN e_left AS b ON a.l_id=b.l_id WHERE $CONDITIONS and a.l_id=29' \
--split-by a.l_id \ (指定主键)
--target-dir /user/oozie/oozie_test/dir18 \
--fields-terminated-by ',' \
--m 2
注意:
1、引号问题,要么外层使用单引号,内层使用双引号,$CONDITIONS的$符号不用转义, 要么外层使用双引号,那么内层使用单引号,然后$CONDITIONS的$符号需要转义
2、自定义的SQL语句中必须带有WHERE \$CONDITIONS
导入没有主键的表到HDFS上
sqoop import \
--connect jdbc:mysql://localhost:3306/linshi_1 \
--username root \
--password 123456 \
--table article \
--split-by l_id \ (关键)
--mapreduce-job-name article_FromMySQL2HDFS \
--columns "title,l_id,l_title,c_title" \
--delete-target-dir \
--fields-terminated-by '\t' \
--m 2 \
--target-dir /tmp/article
字段为null时,替换为指定的值
sqoop import \
--connect jdbc:mysql://158.158.4.52:3306/linshi_1 \
--username root \
--password kn20180806 \
--table e_board_1 \
--mapreduce-job-name e_board_1_FromMySQL2HDFS \
--delete-target-dir \
--fields-terminated-by '\t' \
--m 2 \
--target-dir /tmp/e_board_1 \
--null-string '空' \
--null-non-string 0
增量导入 数据到HDFS
sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/linshi_1 \
--username root \
--password 123456 \
--table e_board \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--m 1 \
--target-dir /apps/hive/warehouse/test01.db/e_board \
--incremental append \
--check-column id \
--last-value 13