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