sqoop基本操作


sqoop基本操作
 
1. 查詢mysql中的數據庫

sqoop list-databases --connect jdbc:mysql://haoguan-HP-Compaq-Pro-6380-MT:3306 --username root --password 123456 

 

2. import從mysql中導入數據到hdfs

create database testdb; 
use testdb; 
create table user( 
id int not null auto_increment, 
account varchar(255) default null, 
password varchar(255) default null, 
primary key(id) 
); 
 
insert into user(account, password) values('aaa', '123'); 
insert into user(account, password) values('bbb', '123'); 
insert into user(account, password) values('ccc', '123'); 
insert into user(account, password) values('ddd', '123'); 
insert into user(account, password) values('eee', '123'); 
insert into user(account, password) values('fff', '123'); 
insert into user(account, password) values('ggg', '123'); 
insert into user(account, password) values('hhh', '123');

 
注:--direct不能同時與 --as-sequencefile --as-avrodatafile  --as-parquetfile連用
Parameters --as-sequencefile --as-avrodatafile and --as-parquetfile are not supported with --direct params in MySQL case.
 
 
1. MySql -> Hdfs -> Hive, parquet文件
(1) sqoop導入數據到hdfs中

sqoop import \ 
--connect jdbc:mysql://haoguan-HP-Compaq-Pro-6380-MT:3306/testdb \ 
--username root \ 
--password 123456 \ 
--table user \ 
--target-dir /sqoop/import/user_parquet \ 
--delete-target-dir \ 
--num-mappers 1 \ 
--as-parquetfile 

(2) 利用導入的數據直接在hive中建表,無需再指定row format與fields terminated by

create external table user_from_mysql( 
id int,                                
account string,                        
password string)                       
stored as parquet 
location '/sqoop/import/user_parquet'; 

2. query,columns,where條件導入 

(1) query, where子句必須有$CONDITIONS(固定寫法)

sqoop import \ 
--connect jdbc:mysql://haoguan-HP-Compaq-Pro-6380-MT:3306/testdb \ 
--username root \ 
--password 123456 \ 
--query 'select id,account from from user where account="ddd" and $CONDITIONS' \ 
--target-dir /user/haoguan/sqoop/import/user_parquet \ 
--delete-target-dir \ 
--fields-terminated-by '\t' \ 
--num-mappers 1 \ 
--as-parquetfile 

(2) columns指定導入的字段
注:--columns account,password字段之間不能有空格
   用-P代替--password是為了不用明文指定數據庫連接密碼

sqoop import \ 
--connect jdbc:mysql://109.123.121.104:3306/testdb \ 
--username root \ 
-P \ 
--table user \ 
--columns account,password \ 
--target-dir /sqoop/import/user_column \ 
--delete-target-dir \ 
--fields-terminated-by '\t' \ 
--num-mappers 1 \ 
--direct 

(3)where子句 

sqoop import \ 
--connect jdbc:mysql://109.123.121.104:3306/testdb \ 
--username root \ 
--password 123456 \ 
--table user \ 
--where 'id > 5 and account like "f%"' \ 
--target-dir /sqoop/import/user_where \ 
--delete-target-dir \ 
--fields-terminated-by '\t' \ 
-m 1 \ 
--direct 

3. MySql -> Hive
注: Mysql直接導入數據到Hive表中,不支持--as-parquetfile,即使在hive表創建的時候指定stored as parquet也無效
    只能間接通過"MySql -> Hdfs -> Hive, parquet文件"轉換
創建hive表user_to_hive
失敗:

drop table if exists user_to_hive_parquet; 
create table user_to_hive_parquet( 
id int, 
account string, 
password string) 
row format delimited fields terminated by '\t' 
stored as parquet; 
sqoop import \ 
--connect jdbc:mysql://109.123.121.104:3306/testdb \ 
--username root \ 
--password 123456 \ 
--table user \ 
--hive-import \ 
--hive-database testdb \ 
--hive-table user_to_hive_parquet \ 
--delete-target-dir \ 
--fields-terminated-by '\t' \ 
-m 1 \ 
--as-parquetfile 

成功:只能普通文本文件導入

drop table if exists user_to_hive; 
create table user_to_hive( 
id int, 
account string, 
password string) 
row format delimited fields terminated by '\t'; 
sqoop import \ 
--connect jdbc:mysql://109.123.121.104:3306/testdb \ 
--username root \ 
--password 123456 \ 
--table user \ 
--hive-import \ 
--hive-database testdb \ 
--hive-table user_to_hive \ 
--delete-target-dir \ 
--fields-terminated-by '\t' \ 
-m 1

4. Hdfs/Hive -> MySql
(1) 導入文本文件表
創建mysql中的表

create table user_from_hive like user; 

導出數據到MySql

sqoop export \ 
--connect jdbc:mysql://109.123.121.104:3306/testdb \ 
--username root \ 
--password 123456 \ 
--table user_from_hive \ 
--export-dir /sqoop/import/user \ 
--input-fields-terminated-by '\t' \ 
-m 1 

 
(2) 導入parquet文件表到Mysql
創建mysql中的表
create table user_from_hive_parquet like user;
導出數據到MySql
注:如果hive中文件是parquet格式,無需指定--input-fields-terminated-by '\t'  

sqoop export \ 
--connect jdbc:mysql://109.123.121.104:3306/testdb \ 
--username root \ 
--password 123456 \ 
--table user_from_hive_parquet \ 
--export-dir /sqoop/import/user_parquet \ 
-m 1

 
5.增量導入到hdfs
注:從原表中id=5后面一行開始
(1) 增量導入文本文件textfile

sqoop import \ 
--connect jdbc:mysql://109.123.121.104:3306/testdb \ 
--username root \ 
--password 123456 \ 
--table user \ 
--target-dir /sqoop/import/user \ 
--fields-terminated-by '\t' \ 
-m 1 \ 
--check-column id \ 
--incremental append \ 
--last-value 5 

(2) 增量導入parquet文件 

方式一:不支持按指定條件追加數據,只能固定以某個列為標准追加
--check-column id      以ID列為標准
--incremental append   追加方式
--last-value 5         id = 5后面一行開始追加

sqoop import \ 
--connect jdbc:mysql://109.123.121.104:3306/testdb \ 
--username root \ 
--password 123456 \ 
--table user \ 
--target-dir /sqoop/import/user_parquet \ 
--fields-terminated-by '\t' \ 
--as-parquetfile \ 
-m 1 \ 
--check-column id \ 
--incremental append \ 
--last-value 5 

方式二: 可以按指定條件把查詢結果追加到表中
--append

sqoop import \ 
--connect jdbc:mysql://haoguan-HP-Compaq-Pro-6380-MT:3306/testdb \ 
--username root \ 
--password 123456 \ 
--query 'select * from user where id=5 and $CONDITIONS' \ 
--target-dir /sqoop/import/user \ 
--num-mappers 1 \ 
--append 

(3)給hive表追加數據
給hive表導入數據
注:最好使用--delete-target-dir,否則在導入數據過程中hive會在/user/haoguan/user目錄中生成_SUCCESS文件,下次再操作的時候,會報/user/haoguan/user目錄已經存在

sqoop import \ 
--connect jdbc:mysql://109.123.121.104:3306/testdb \ 
--username root \ 
--password 123456 \ 
--table user \ 
--delete-target-dir \ 
--hive-import \ 
--hive-database testdb \ 
--hive-table user_to_hive \ 
--fields-terminated-by '\t' \ 
-m 1 

可以在hive表目錄中直接追加數據,也就相當於給hive追加數據了 

sqoop import \ 
--connect jdbc:mysql://109.123.121.104:3306/testdb \ 
--username root \ 
--password 123456 \ 
--query 'select * from user where id=5 and $CONDITIONS' \ 
--fields-terminated-by '\t' \ 
-m 1 \ 
--append \ 

不支持在hive表中直接追加數據,以下操作會報異常

sqoop import \ 
--connect jdbc:mysql://109.123.121.104:3306/testdb \ 
--username root \ 
--password 123456 \ 
--query 'select * from user where id=5 and $CONDITIONS' \ 
--hive-import \ 
--hive-database testdb \ 
--hive-table user_to_hive \ 
--fields-terminated-by '\t' \ 
-m 1 \ 
--append 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM