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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章