1、列出mysql数据库中的所有数据库
sqoop list-databases --connect jdbc:mysql://localhost:3306/ -username root -password 000000
2、连接mysql并列出数据库中的表
sqoop list-tables --connect jdbc:mysql://localhost:3306/test --username root --password 000000
3、把数据从mysql导入到hdfs中
- 全量导入
Sqoop import \
--connect jdbc:mysql://localhost:3306/test --username root --password
000000
--table avatar
--fields-terminated-by '=='
-m 1
- sql导入
sqoop import \
--connect jdbc:mysql://localhost:3306/test --username root --password 000000
--query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \
--split-by a.id
--target-dir /user/foo/joinresults
顺序导入
* sqoop import \
--connect jdbc:mysql://localhost:3306/test --username root --password 000000
--query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \
--split-by a.id
-m 1
--target-dir /user/foo/joinresults
参数说明:
1、--split-by 表示划分列,默认是主键,见《hadoop权威指南》
2、-m 1 表示用1个map,顺序导入,多个的话,记录的顺序变了;默认是4个,最好不要将数字设置为高于集群的节点数
3、--query 从查询结果中导入数据,该参数使用时必须指定–target-dir或者
–hive-table,在查询语句中一定要有where条件且在where条件中需要包含$CONDITIONS,如果语句使用双引号包裹使用 \$CONDITIONS,如果语句使用单引号包裹使用$CONDITIONS(如上例子中)
4、将mysql数据的表结构复制到hive中
sqoop create-Hive-table
--connect jdbc:mysql://localhost:3306/test --table users --username root --password 000000
--hive-table users
--fields-terminated-by "\0001"
--lines-terminated-by "\n";
参数说明:
1、--fields-terminated-by "\0001" 是设置每列之间的分隔符,"\0001"是ASCII码中的1,它也是hive的默认行内分隔符, 而sqoop的默认行内分隔符为","
2、--lines-terminated-by "\n" 设置的是每行之间的分隔符,此处为换行符,也是默认的分隔符;
注意:只是复制mysql表的结构,mysql表中的内容没有复制,复制得到hive表,但hive表中无内容
5、将数据从mysql数据库导入文件到hive表中——import
- 全量导入
sqoop import
--connect jdbc:mysql://localhost:3306/test --username root --password 000000
--table users
--hive-import --hive-table users
-m 2
--fields-terminated-by "\0001";
参数说明:
1、-m 2 表示由两个map作业执行;
2、--fields-terminated-by "\0001" 需同创建hive表时保持一致;
注意:先根据mysql表的结构得到hive表,然后将mysql表中的数据导入到hive表(也就是导入到HDFS,因为hive表的数据是存在hdfs上的warehouse)
- --columns --where 语句使用
sqoop import --append --connect jdbc:mysql://192.168.20.118:3306/test --username root --password 000000 --table userinfos
--columns "id,age,name"
--where "id > 3 and (age = 88 or age = 80)"
-m 1
--hive-import --hive-table userinfos2
--fields-terminated-by ",";
- query查询导入
sqoop import \
--connect jdbc:mysql://localhost:3306/test --username root --password 000000
--query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \
--split-by a.id
--hive-import --hive-table userinfos2
注意:
1、--query 从查询结果中导入数据,该参数使用时必须指定–target-dir或者
–hive-table,在查询语句中一定要有where条件且在where条件中需要包含$CONDITIONS,如果语句使用双引号包裹使用 \$CONDITIONS,如果语句使用单引号包裹使用$CONDITIONS(如上例子中)
2、query 不能和-table搭配使用 ,加上 -columns 、 -where 无效
- 追加导入
$ sqoop import
--connect jdbc:mysql://db.foo.com/somedb --table sometable \
--where "id > 100000" --target-dir /incremental_dataset –append
参数说明:
1、–append 将数据追加到hdfs中已经存在的dataset中。使用该参数,sqoop将把数据先导入到一个临时目录中,然后重新给文件命名到一个正式的目录中,以避免和该目录中已存在的文件重名。
- 导入所有的表import-all-tables
将数据库里的所有表导入到HDFS中,每个表在hdfs中都对应一个独立的目录,每个表都要有主键,不能使用where条件过滤,
sqoop import-all-tables –connect jdbc:mysql://localhost:3306/test
sqoop import-all-tables –connect jdbc:mysql://localhost:3306/test –hive-import
参数说明:
--hive-import 将数据从关系数据库中导入到hive表中
6、hive常见导入参数
--hive-home 重写$HIVE_HOME
--hive-import 插入数据到hive当中,使用hive的默认分隔符
--hive-overwrite 重写插入
--create-hive-table 建表,如果表已经存在,该操作会报错!
--hive-table [table] 设置到hive当中的表名
--hive-drop-import-delims 导入到hive时删除 \n, \r, and \01
--hive-delims-replacement 导入到hive时用自定义的字符替换掉 \n, \r, and \01
--hive-partition-key hive分区的key
--hive-partition-value hive分区的值
--map-column-hive 类型匹配,sql类型对应到hive类型
7、hive空值处理
sqoop会自动把NULL当做字符串处理,以null被导入进Hive表中,但是hive中默认是把\N来表示null,所以我们需要使用 --null-string 和 --null-non-string来处理空值 把\N转为\N
sqoop import ...
--null-string '\\N'
--null-non-string '\\N'
8、从MySQL导入数据到HBase
sqoop import \
--connect jdbc:mysql://192.168.184.12/angel --username anqi --password anqi_mima \
--query "SELECT * FROM xi WHERE 1=1 AND \$CONDITIONS" \
--hbase-table hxi \
--hbase-create-table \
--hbase-row-key id \
--split-by date \
-m 7 \
--column-family aitanjupt \
--hbase-bulkload
上面SQL语句较简单。经检验,更复杂的SQL语句,Sqoop支持得很好,导入正常。
参数说明:
--hbase-table:通过指定--hbase-table参数值,指明将数据导入到HBase表中,而不是HDFS上的一个目录。输入表中的每一行将会被转换成一个HBase Put操作的输出表的一行。
--hbase-create-table:如果HBase中的目标表和列族不存在,如果你使用该参数,Sqoop在运行任务的时候会根据HBase的默认配置,首先创建目标表和列族。
--hbase-row-key:你可以使用--hbase-row-key参数,手动的指定row key。默认的情况下,Sqoop会将split-by 列作为HBase rowkey列。如果没有指定split-by值,它将会试图识别关系表的关键字。
如果源表是组合关键字,--hbase-row-key 参数后面值是用逗号分隔的组合关键字属性的列表,在这样种情况下,通过合并组合关键字属性的值来产生HBase的Row key,每个值之间使用下划线分隔开来。
--column-family:必须指定--column-family参数,每一个输出列都会被放到同一个family列族中。
--hbase-bulkload:使用hbase bulkload导入,效率高
9、两个特别的参数
sqoop.bigdecimal.format.string 大decimal是否保存为string,如果保存为string就是 0.0000007,否则则为1E7
sqoop.hbase.add.row.key 是否把作为rowkey的列也加到行数据当中,默认是false的
10、import demo
- 指定列
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--columns "employee_id,first_name,last_name,job_title"
- 使用8个线程
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
-m 8
- 快速模式
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--direct
- 使用sequencefile作为存储方式
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--class-name com.foocorp.Employee --as-sequencefile
- 分隔符
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--fields-terminated-by '\t' \
--lines-terminated-by '\n' \
--optionally-enclosed-by '\"'
- 导入到hive
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--hive-import
- 条件过滤
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--where "start_date > '2010-01-01'"
- 用dept_id作为分个字段
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--split-by dept_id
11、从hdfs中导数据到关系数据库中——export
sqoop export
--connect jdbc:mysql://192.168.20.118:3306/test --username root --password 000000
--table users
--export-dir /user/hive/warehouse/users/part-m-00000
--input-fields-terminated-by '\0001'
--update-key id
参数说明:
1、在进行导入之前,mysql中的表userst必须已经提前创建好了。
2、update-key 后面接条件列名,通过该参数,可以将关系数据库中已经存在的数据进行更新操作,类似于关系数据库中的update操作
3、--export-dir 存放数据的HDFS的源目录
4、--update-mode allowinsert 如果存在就更新,不存在就插入
12、export demo
$ sqoop export --connect jdbc:mysql://db.example.com/foo --table bar \
--export-dir /results/bar_data
$ sqoop export --connect jdbc:mysql://db.example.com/foo --table bar \
--export-dir /results/bar_data --validate
$ sqoop export --connect jdbc:mysql://db.example.com/foo --call barproc \
--export-dir /results/bar_data