Apache Sqoop导入&导出

RDBMS->HDFS

全表导入

sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://CentOS:3306/test?characterEncoding=UTF-8 \
--username root \
--password root \
--table t_user \
--num-mappers 4 \
--fields-terminated-by '\t' \
--target-dir /mysql/test/t_user \
--delete-target-dir 
参数 含义
–-connect 连接的数据库地址
-–username 连接的数据库的用户名
–-password 连接的数据库的密码
–-table 想要导出数据的表
–target-dir 要导入到hdfs中的目录(如果不指定,默认存储在“/user/用户名/导入的表名” 目录下)
-–delete-target-dir 表示如果在hdfs中有该目录,则先删除,然后再导入数据到该目录下
–num-mappers 表示设置的maptask个数,默认为4个,决定最终在hdfs中生成的文件个数(将table中的数据分成几个文件分别存储)
–fields-terminated-by 指定字段的分割符号

字段导入

sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://CentOS:3306/test?characterEncoding=UTF-8 \
--username root \
--password root \
--table t_user \
--columns id,name,age \
--where "id > 2 or name like '%z%'" \
--target-dir /mysql/test/t_user \
--delete-target-dir \
--num-mappers 4 \
--fields-terminated-by '\t'
字段 含义
–columns 指定要查询的字段
–where 指定过滤条件

导入查询

sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://CentOS:3306/test \
--username root \
--password root \
--num-mappers 3 \
--fields-terminated-by '\t' \
--query 'select id, name,sex, age ,birthDay from t_user where $CONDITIONS LIMIT 100 ' \
--split-by id \
--target-dir /mysql/test/t_user \
--delete-target-dir

如果要并行导入查询结果,则每个Map任务将需要执行查询的副本,其结果由Sqoop推断的边界条件进行分区。您的查询必须包含令牌$CONDITIONS,每个Sqoop进程将用唯一条件表达式替换该令牌。您还必须使用--split-by选择拆分列。

RDBMS -> Hive

全量导入

sqoop import \
--connect jdbc:mysql://CentOS:3306/test \
--username root \
--password root \
--table t_user \
--num-mappers 3 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table baizhi.t_user

[root@CentOS ~]# cp /usr/apache-hive-1.2.2-bin/lib/hive-common-1.2.2.jar /usr/sqoop-1.4.7/lib/
[root@CentOS ~]# cp /usr/apache-hive-1.2.2-bin/lib/hive-exec-1.2.2.jar /usr/sqoop-1.4.7/lib/

导入分区

sqoop import \
--connect jdbc:mysql://CentOS:3306/test \
--username root \
--password root \
--table t_user \
--num-mappers 3 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table baizhi.t_user \
--hive-partition-key city \
--hive-partition-value 'bj'

RDBMS-> Hbase

sqoop import \
--connect jdbc:mysql://CentOS:3306/test \
--username root \
--password root \
--table t_user \
--num-mappers 3 \
--hbase-table baizhi:t_user1 \
--column-family cf1 \
--hbase-create-table \
--hbase-row-key id \
--hbase-bulkload 
参数 含义
–hbase-table 写入hbase中的表
–column-family 导入的列簇
–hbase-create-table 创建表
–hbase-row-key 指定字段作为rowkey
–hbase-bulkload 启动Hbase 批量写入

HDFS -> MySQL

0	zhangsan	true	20	2020-01-11
1	lisi	false	25	2020-01-10
3	wangwu	true	30	2020-01-17
create table t_user(
 id int primary key auto_increment,
 name VARCHAR(32),
 sex boolean,
 age int,
 birthDay date
) CHARACTER SET=utf8;
sqoop-export \
--connect jdbc:mysql://CentOS:3306/test \
--username root \
--password root \
--table t_user  \
--update-key id  \
--update-mode allowinsert \
--export-dir /mysql/test/t_user \
--input-fields-terminated-by '\t'

导入模式可选值可以是updateonly或者allowinsert,updateonly仅仅会更新已经存在的记录。

Hbase-> MySQL

1、现将Hbase数据->HIVE

[root@CentOS ~]# hive -e 'use baizhi;create table t_tmp as select * from t_employee'
create  table t_employee(empno INT,
    ename varchar(32),
    job varchar(32),
    mgr INT,
    hiredate TIMESTAMP,
    sal DECIMAL(7,2),
    comm DECIMAL(7,2),
    deptno INT)

2、将Hive数据导出到MySQL

sqoop-export \
--connect jdbc:mysql://CentOS:3306/test \
--username root \
--password root \
--table t_employee \
--export-dir '/user/hive/warehouse/baizhi.db/t_tmp' \
--input-fields-terminated-by '\001' \
--input-null-string '\\N' \
--input-null-non-string '\\N';
参数 含义
–export-dir 需要读取的文件位置
–input-fields-terminated-by 字段分割符号
–input-null-string 对于一些字符串字段,出现该值认为是null
–input-null-non-string 对于一些字符串非空字段,出现该值认为是null
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章