sqoop主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,
可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,
也可以将HDFS的数据导进到关系型数据库中。

sqoop import 导入

–connect jdbc:mysql://127.0.0.1:3306/$db_name\ 连接数据库
–username root\ 数据库用户名
–password root\ 数据库密码
–table tb_export_task \ 表名称
–hive-drop-import-delims \导入到hive时删除 \n, \r, and \0001
–delete-target-dir \HDFS地址存在删除
–null-string ‘\N’ \空值转换
–null-non-string ‘\N’ \ 非空字符串替换
–fields-terminated-by “\t” \ 字符串分割
–lines-terminated-by ‘\n’
–where “$4”’ \ 条件查询
–columns <col,col,col…> \ 从表中导出指定的一组列的数据
–query 导入的查询语句
–target-dir /origin_data/bigdata/product \ HDFS地址
-m maptask数

注意:
在mysql中字段值明明是NULL, 为什么到hive查询后 where field is null 会没有结果呢,然后通过检查一看 居然NULL值都变成了字段串’null’。
在hive里面NULL是用\N来表示的
–null-string含义是 string类型的字段,当Value是NULL,替换成指定的字符
–null-non-string 含义是非string类型的字段,当Value是NULL,替换成指定字符

sqoop import -D mapreduce.job.queuename=dev \
--connect jdbc:mysql://127.0.0.1:3306/db?tinyInt1isBit=false \
--username sqoop \
--password xxx \
--table ttt \
--hive-drop-import-delims \
--null-string '\\N' \
--null-non-string '\\N' \
--fields-terminated-by '\001' \
--lines-terminated-by '\n' \
--delete-target-dir \
--target-dir /origin_data/bigdata/product/ods_tb_export_task \
-m 1

sqoop export 导出

导出需要注意两个参数,主要在增量更新中使用
–update-key id \ 更新标识,即根据某个字段进行更新,
–update-mode allowinsert \指定allowinsert,更新已存在的数据记录,同时插入新纪录,指定updateonly(默认模式),仅仅更新已存在的数据记录,不会插入新纪录。

sqoop export -D mapred.job.queue.name=root.badm \
--connect jdbc:mysql://127.0.0.1:3306/db_stats \
--username sqoop \
--password xxxx \
--table table_order \
--columns 'id ,
transaction_id ,
user_id ,
work_order_no ,
ticket_id ,
price ,
liters ,
cou_no
' \
--mapreduce-job-name 'ads_line_order' \
--update-key id \
--update-mode allowinsert \
--input-fields-terminated-by '\001' \
--input-lines-terminated-by '\n' \
--export-dir /origin_data/bigdata/product/ods_tb_export_task \
-m 1