sqoop常用命令

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

你可能感兴趣的:(sqoop常用命令)