一.概述
1.Hadoop的開發問題
只能用java語言開發,存在語言門檻
需要對Hadoop底層原理,api比較了解才能做開發
開發調試比較麻煩
2.什么是Hive
Hive是基於Hadoop的一個數據倉庫工具。可以將結構化的數據文件映射為一張表,並提供完整的sql查詢功能
底層是將sql語句轉換為MapReduce任務進行運行
Hive提供了一系列的工具,可以用來進行數據提取、轉化、加載(ETL Extract-Transform-Load ),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制
本質上是一種大數據離線分析工具
3.HQL
HQL - Hive通過類SQL的語法,來進行分布式的計算
HQL用起來和SQL非常的類似,Hive在執行的過程中會將HQL轉換為MapReduce去執行,所以Hive其實是基於Hadoop的一種分布式計算框架,底層仍然是MapReduce
4.優點和缺點
優點:
學習成本低,只要會sql就能用hive
開發效率高,不需要編程,只需要寫sql
模型簡單,易於理解
針對海量數據的高性能查詢和分析
HiveQL 靈活的可擴展性(Extendibility)
高擴展性(Scalability)和容錯性
與 Hadoop 其他產品完全兼容
缺點:
不支持行級別的增刪改
不支持完整的在線事務處理
本質上仍然是MR的執行,效率不算高
5.適用場景
Hive 構建在基於靜態(離線)批處理的Hadoop 之上,Hadoop 通常都有較高的延遲並且在作業提交和調度的時候需要大量的開銷。因此,Hive 並不能夠在大規模數據集上實現低延遲快速的查詢因此,Hive 並不適合那些需要低延遲的應用
Hive 並不提供實時的查詢和基於行級的數據更新操作,最佳使用場合是大數據集的離線批處理作業,例如,網絡日志分析
二.執行流程
1.通過客戶端提交一條Hql語句
2.通過complier(編譯組件)對Hql進行詞法分析、語法分析。在這一步,編譯器要知道此hql語句到底要操作哪張表
3.去元數據庫找表信息
4.得到信息
5.complier編譯器提交Hql語句分析方案
6.執行流程
a.executor 執行器收到方案后,執行方案(DDL過程)。在這里注意,執行器在執行方案時,會進行判斷:如果當前方案不涉及到MR組件,比如為表添加分區信息、比如字符串操作等,比如簡單的查詢操作等,此時就會直接和元數據庫交互,然后去HDFS上去找具體數據;如果方案需要轉換成MR job,則會將job 提交給Hadoop的JobTracker
b.MR job完成,並且將運行結果寫入到HDFS上
c.執行器和HDFS交互,獲取結果文件信息
7.如果客戶端提交Hql語句是帶有查詢結果性的,則會發生:7-8-9步,完成結果的查詢
三.優化(略)
1. map side join
2.join語句優化
3.group by 優化
4.count distinct 優化
5.調整切片數(map任務數)
6.JVM重利用
7.啟用嚴格模式
8.關閉推測執行機制
四.安裝
偽分布式下安裝Hive
1.安裝JDK
cd /opt/software
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/8u201-b09/42970487e3af4f5aa5bca3f542482c60/jdk-8u201-linux-x64.tar.gz
tar -xvf jdk-8u201-linux-x64.tar.gz
2.安裝Hadoop
wget http://mirrors.shu.edu.cn/apache/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz
tar -xvf hadoop-2.7.1.tar.gz
4.配置JDK和Hadoop的環境變量
vim /etc/profile #JAVA_HOME export JAVA_HOME=/opt/software/jdk-8u201-linux-x64 export PATH=$PATH:$JAVA_HOME/bin #HADOOP_HOME export HADOOP_HOME=/opt/software/hadoop-2.7.1 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#保存退出后
source /etc/profile
5.下載解壓Hive安裝包
wget http://mirrors.shu.edu.cn/apache/apache-hive-1.2.0-bin.tar.gz
tar -xvf apache-hive-1.2.0-bin.tar.gz
6.啟動Hadoop的HDFS和Yarn
start-all.sh
7.進入到Hive的bin目錄,啟動Hive:sh hive (或者執行:./hive)
cd /opt/software/apache-hive-1.2.0-bin/bin
sh hive
配置MySQL
1.下載mysql安裝包
2.確認當前虛擬機之前是否有安裝過mysql
rpm -qa #查看linux安裝過的所有rpm包
rpm -qa | grep mysql
刪除mysql
rpm -ev --nodeps mysql-libs-5.1.71-1.el6.x86_64
再執行:
rpm -qa | grep mysql #發現沒有相關信息
3.安裝mysql server rpm包和client包
rpm -ivh MySQL-server-5.6.29-1.linux_glibc2.5.x86_64.rpm rpm -ivh MySQL-client-5.6.29-1.linux_glibc2.5.x86_64.rpm
4.修改my.cnf,默認在/usr/my.cnf,執行:vim /usr/my.cnf,添加如下內容
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character_set_server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
5.將mysqld加入系統服務,並隨機啟動
cp /usr/share/mysql/mysql.server /etc/init.d/mysqld
6.啟動mysqld,執行:
service mysqld start
7.查看初始生成的密碼,執行:
vim /root/.mysql_secret
這個密碼隨機生成的
8.修改初始密碼
mysqladmin -u root -p password root
此時,提示要輸入初始生成的密碼,拷貝過來即可
9.進入mysql數據庫
mysql -u root -p
如果出現不能修改密碼的問題,則可以執行如下命令強制修改:
a.關閉MySQL服務:
service mysqld stop
b.進入安全模式:
mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
c.在安全模式下輸入:
mysql -u root mysql
d.進入mysql之后輸入:
UPDATE user SET Password=PASSWORD('newpassword') where USER='root'; FLUSH PRIVILEGES; quit;
e.重啟MySQL服務:
service mysqld restart
五.基礎操作
show databases; #查數據庫 create database park; #創建park數據庫 use park; #進入park數據庫 show tables; 查看表 create table stu (id int,name string); #創建stu表 create table stu2 like stu; #創建一個和表stu結構一樣的stu2表 insert into stu values(1,'zhang'); #向表stu插入數據 select * from stu; #查看表stu數據 desc stu; #查看表stu結構 drop table stu; #刪除表stu create table stu(id int,name string) row format delimited fields terminated by ' '; #創建stu表,並指定分割符 空格 load data local inpath '/opt/software/1.txt' into table stu; #通過加載文件數據到指定的表stu里 insert overwrite table stu1 select * from stu; #把stu表數據插入到stu1表中 insert overwrite local directory '/opt/stu' row format delimited fields terminated by ' ' select * from stu; #將stu表中查詢的數據寫到本地的/opt/stu目錄下 insert overwrite directory '/stu' row format delimited fields terminated by ' ' select * from stu; #將stu表中查詢的數據寫到HDFS的stu目錄下 from stu insert overwrite table stu1 select * insert overwrite table stu2 select *; #將stu表中查詢的數據寫到stu1以及stu2兩張表中 alter table stu rename to stu2; #為表stu重命名為stu2 alter table stu add columns (age int); #為表stu增加一個列字段age,類型為int exit; #退出Hive
注意點:
1.創建的數據庫,實際是在Hadoop的HDFS文件系統里創建一個目錄節點,統一存在: /user/hive/warehouse 目錄下
2.hive里,表示字符串用的是string,不用char和varchar
3.所創建的表,也是HDFS里的一個目錄節點
4.HDFS不支持數據的修改和刪除,因此已經插入的數據不能夠再進行任何的改動
5.insert into 語句執行的實際上是追加操作
6.Hive支持查詢,行級別的插入。不支持行級別的刪除和修改
7.Hive的操作實際是執行一個job任務,調用的是Hadoop的MR
8.插入完數據之后,發現HDFS stu目錄節點下多了一個文件,文件里存了插入的數據,因此,hive存儲的數據,是通過HDFS的文件來存儲的
9.Hive的工作原理實際上就是在管理hdfs上的文件,把文件里數據抽象成二維表結構,然后提供hql語句供程序員查詢文件數據
10.like只復制表結構,不復制數據
六.表結構
1.內部表和外部表
a.內部表和外部表概述
內部表:先在hive里建一張表,然后向這個表插入數據(用insert可以插入數據,也可以通過加載外部文件方式來插入數據),這樣的表稱之為hive的內部表
外部表:HDFS里已經有數據了,然后,通過hive創建一張表來管理這個文件數據。則這樣表稱之為外部表。需要注意的是,hive外部表管理的是HDFS里的某一個目錄下的文件數據
外部表創建命令:
create external table stu (id int,name string) row format delimited fields terminated by ' ' location '/目錄路徑';
b.內部表和外部表區別
對於內部表,在刪除該表的時候,HDFS對應的目錄節點會被刪除
對於外部表,在刪除該表的時候,HDFS對應的目錄節點不會刪除
2.分區表
a.分區表概述
分區表可以通過添加指定的字段來提高Hive的查詢效率
在數據量較大的情況下,往往會添加分區表來避免全表查詢
b.指令
#創建book表,以category作為分區(在創建分區表時,partitioned字段可以不在字段列表中。生成的表中自動就會具有該字段)
create table book (id int, name string) partitioned by (category string) row format delimited fields terminated by '\t';
#將本地文件cn.txt添加到book表中,分區字段為cn(在HDFS下會生成category=cn目錄)
load data local inpath '/home/cn.txt' overwrite into table book partition (category='cn');
#查看分區為cn的數據
select * from book where category='cn';
#將指定的目錄添加為分區字段
ALTER TABLE book add PARTITION (category = 'jp') location '/user/hive/warehouse/park.db/book/category=jp';
#查看分區
show partitions iteblog;
#修復分區
msck repair table book;
#刪除分區
alter table book drop partition(category='cn');
#修改分區的名字
alter table book partition(category='french') rename to partition (category='hh');
c.動態分區
如果在進行查詢的時候一個表中的數據是未分區的一個表中的數據是已經分區的,則此時從未分區的表中查詢數據向已分區表中添加是不行的。所以此時需要開啟動態分區
設置指令:
set hive.exec.dynamic.partition = true; set hive.exec.dynamic.partition.mode = nostrict; insert into table stu2 partition(class) select id, name, class from stu distribute by class;
3.分桶表
a.分桶表概述
分桶表是一種更細粒度的數據分配方式
一個表既可以分區也可以分桶
分桶的主要作用是實現數據的抽樣,方便進行數據測試
分桶表通過hash分桶算法,將數據分放在不同的桶(hdfs中的文件)中,方便后續獲取
分桶表機制默認是不開啟的,需要手動開啟:set hive.enforce.bucketing=true;
分桶表不允許以外部文件方式導入數據,只能從另外一張表數據導入
操作指令:
#創建teacher表,以name作為分桶機制,分為3個桶
create table teacher(name string) clustered by (name) into 3 buckets row format delimited fields terminated by ' ';
#將tmp表中的數據添加到teacher表中(實際上是產生了3個文件用於存儲不分桶的數據)
insert overwrite table teacher select * from tmp;
#進行抽樣
select * from teacher tablesample(bucket 1 out of 3 on name);
抽樣格式為:bucket x out of y on XXX
1. x表示抽樣的起始桶,例如bucket 1 out of 3表示從第1 個桶開始抽取數據
2. y決定抽樣的比例,要求必須是桶數的因子或者整數倍
a. 如果桶數為6,y為2,則表示抽取6/2=3個桶中的數據
b. 如果桶數為6,y為3,則表示抽取6/3=2個桶中的數據
c. 如果桶數為6,y為12,則表示抽取6/12=0.5個桶中的數據
如果桶數為6,抽樣為bucket 1 out of 3 on id表示從第1個桶開始抽樣,抽取2個桶的數據,所以抽取的樣本為1和4桶中的數據
七.Hive中的join
#建表
create external table order_t (id string,time string,pid string,amount int) row format delimited fields terminated by ' ' location '/order'; create external table product_t (pid string,name string,price int) row format delimited fields terminated by ' ' location '/product';
#join查詢
select * from product_t join order_t on product_t.pid=order_t.pid;
#inner join
select * from product_t inner join order_t on product_t.pid=order_t.pid;
#left join
select * from product_t left join order_t on product_t.pid=order_t.pid;
#right join
select * from product_t right join order_t on product_t.pid=order_t.pid;
#full outer join
select * from product_t full outer join order_t on product_t.pid=order_t.pid;
#left semi join
select * from product_t left semi join order_t on product_t.pid=order_t.pid;
八.其他注意點
1.SerDe序列化
概述:
SerDe是Hive提供用於進行序列化和反序列化的機制
其中提供了正則表達式形式用以讀取不規范的數據,在使用的時候,正則表達式中的每一個捕獲組對應了Hive表中的一個字段
案例:
文件內容如下:
192.168.120.23 -- [30/Apr/2018:20:25:32 +0800] "GET /asf.avi HTTP/1.1" 304 - 192.168.120.23 -- [30/Apr/2018:20:25:32 +0800] "GET /bupper.png HTTP/1.1" 304 - 192.168.120.23 -- [30/Apr/2018:20:25:32 +0800] "GET /bupper.css HTTP/1.1" 304 - 192.168.120.23 -- [30/Apr/2018:20:25:33 +0800] "GET /bg-button HTTP/1.1" 304 - 192.168.120.23 -- [30/Apr/2018:20:25:33 +0800] "GET /bbutton.css HTTP/1.1" 304 - 192.168.120.23 -- [30/Apr/2018:20:25:33 +0800] "GET /asf.jpg HTTP/1.1" 304 - 192.168.120.23 -- [30/Apr/2018:20:25:33 +0800] "GET /tomcat.css HTTP/1.1" 304 - 192.168.120.23 -- [30/Apr/2018:20:25:33 +0800] "GET /tomcat.png HTTP/1.1" 304 - 192.168.120.23 -- [30/Apr/2018:20:25:33 +0800] "GET /tbutton.png HTTP/1.1" 304 - 192.168.120.23 -- [30/Apr/2018:20:25:33 +0800] "GET /tinput.png HTTP/1.1" 304 - 192.168.120.23 -- [30/Apr/2018:20:25:33 +0800] "GET /tbg.css HTTP/1.1" 304 - 192.168.120.23 -- [30/Apr/2018:20:25:34 +0800] "GET /tomcat.css HTTP/1.1" 304 -
需要提取其中的字段進行使用:
create table log (host string,time string,request string,paths string,way string,stat int) row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' with serdeproperties ("input.regex" = "(.*) \-\- \\[(.*)\\] \"(.*) (.*) (.*)\" ([0-9]+) \-") stored as textfile;
2.beeline遠程連接
簡介:
beeline是hive提供的一種用於遠程連接Hive的方式,其提供了表格形式來進行進行展現
如果使用這種方式,需要先后台啟動hiveserver2
啟動方式:
beeline -u jdbc:hive2://IP地址:10000/庫名
注意:此種方式的情況下,默認是不對用戶名和密碼進行驗證
3.View視圖
概述:
Hive支持視圖,但是不支持物化視圖
只能查詢,不支持加載數據
視圖的創建只是保存一份元數據,只有在查詢視圖的時候才會執行對應的子查詢
視圖定義中若包含了order by/limit等語句,且查詢視圖時也定義了order by/limit等語句,則此時視圖中的優先級更高
view支持迭代視圖
指令:
#創建視圖
create view v_stu as select name from stu;
#刪除視圖
drop view v_stu;
4.索引
概述:
建立索引的目的是為了提高查詢效率
Hive中沒有主鍵的概念,所以默認也是沒有索引的
指令:
#創建索引
create index s_index on table stu(id) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild in table stu_index;
#重建索引
alter index s_index on stu rebuild;
#刪除索引,需要注意的是在刪除索引的時候會把對應的表一起刪除
drop index s_index on stu;
5.JDBC連接
概述:
Hive實現了JDBC接口,所以可以通過Java代碼操作
Hive的JDBC操作在實際應用中用的不多,一般都是在HDFS儲存的文件基礎上建立外部表來進行查詢處理
步驟:
a.服務器端開啟HiveServer服務:
sh hive --service hiveserver2 & (以后台線程啟動)
b.創建本地工程,導入jar包
hive-jdbc-1.2.0-standalone.jar
hadoop-common-2.7.1.jar
c.創建類
//連接和查詢
@Test public void testConnectAndQuery() throws Exception { // 注冊數據庫驅動 Class.forName("org.apache.hive.jdbc.HiveDriver"); // 如果用的是hive2服務,則寫jdbc:hive2,后面跟上hive服務器的ip以及端口號,端口號默認是10000 Connection conn = DriverManager.getConnection("jdbc:hive2://IP地址:10000/park", "root", "root"); Statement stat = conn.createStatement(); ResultSet rs = stat.executeQuery("select * from stu"); while (rs.next()) { String name = rs.getString("name"); System.out.println(name); } stat.close(); conn.close(); } //創建、插入數據及刪除表
@Test public void testInsert() throws Exception { Class.forName("org.apache.hive.jdbc.HiveDriver"); Connection conn = DriverManager.getConnection("jdbc:hive2://IP地址:10000/park", "root", "root"); Statement stat = conn.createStatement(); // executeUpdate可用於:創建表,向表中插入數據以及刪除表 stat.executeUpdate("insert into table stu values(2,'rose')"); stat.executeUpdate("create table stu2(id int,name string) row format delimited fields terminated by ' '"); stat.executeUpdate("drop table stu2"); stat.close(); stat.close(); }
6.元數據
概述:
Hive可以管理hdfs上的文件,用表的形式來管理文件數據。而表名、表里有哪些字段,字段類型、哪張表存在哪個數據下等這些表信息,稱之為hive的元數據信息
默認情況下,Hive的元數據信息不是存在HDFS上的,而是存在Hive自帶的Derby關系型數據庫里的
Hive安裝完成之后,通常都需要替換元數據庫,目前Hive只支持Derby和MySQL兩種元數據庫,需要將元數據庫替換為MySQL
元數據的默認字符集是ISO8859-1
Derby存在的問題
Derby數據庫是一種文件型的數據庫,在進入時會檢查當前目錄下是否有metastore_db文件夾用來存儲數據庫數據,如果有就直接使用,如果沒有就創建,這樣一旦換一個目錄,元數據就找不到了
Derby數據庫是一個單用戶的數據庫,無法支持多用戶同時操作,而hive如果使用derby作為元數據庫,則也只能支持單用戶操作,這就導致在數據量大連接多的情況下會產生大量連接的積壓
Mysql配置:
a.將Mysql驅動包上傳到Hive安裝目錄的lib目錄下
b.進入conf目錄下,編輯新的配置文件,名字為:hive-site.xml
<configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://IP地址:3306/hive?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> </property> </configuration>
c.進入Hive ,進入bin目錄,執行:sh hive
如果出現:Access denied for user 'root'@'主機名' (using password: YES)這個錯誤,指的是當前用戶操作MySQL數據庫的權限不夠
d.進入到MySQL數據庫,進行權限分配,執行
mysql> grant all privileges on *.* to 'root'@'主機名' identified by 'root' with grant option; mysql> grant all on *.* to 'root'@'%' identified by 'root'; mysql> flush privileges;
e.進入mysql數據庫,執行:
create database hive character set latin1;
f.啟動hive客戶端
g.以上步驟都做完后,再次進入mysql的hive數據,發現有如下的表:
h.可以通過SQLyog來連接數據庫
九.Hive中的數據類型
1.基本類型
tinyint(對應Java中的byte)
smallint(對應Java中的short)
int(對應Java中的int)
bigint(對應Java中的long)
boolean(對應Java中的boolean)
float(對應Java中的float)
double(對應Java中的double)
string(對應Java中的String)
timestamp(對應Java中的TimeStamp)
binary(對應Java中的byte[])
2.復雜類型
a.數組類型 array
例子1:
原始數據:
100,200,300 200,300,500
建表語句:
create external table ex(vals array<int>) row format delimited fields terminated by '\t' collection items terminated by ',' location '/ex';
查詢每行數組的個數,查詢語句:
select size(vals) from ex;
注:hive 內置函數不具備查詢某個具體行的數組元素,需要自定義函數來實現
例子2:
原始數據:
100,200,300 tom,jary 200,300,500 rose,jack
建表語句:
create external table ex1(info1 array<int>,info2 array<string>) row format delimited fields terminated by '\t' collection items terminated by ',' location '/ex';
b.map類型
例子1:
原始數據:
tom,23 rose,25 jary,28
建表語句:
create external table m1 (vals map<string,int>) row format delimited fields terminated by '\t' map keys terminated by ',' location '/map';
查詢語句:
select vals['tom'] from m1;
例子2:
原始數據:
tom 192.168.234.21 rose 192.168.234.21 tom 192.168.234.22 jary 192.168.234.21
建表語句 :
create external table ex (vals map<string,string>) row format delimited fields terminated by '\t' map keys terminated by ' ' location '/ex';
注意:map類型,列的分割符必須是\t
查詢語句
select vals['tom'] from ex where vals['tom'] is not null;
如果想做去重工作,可以調用distinct內置函數
select distinct(ip) from (select vals['tom'] ip from ex where vals['tom'] is not null)ex1;或者select distinct(vals['tom']) from m2 where vals['tom'] is not null;
c.struct 類型
例子:
原始數據:
tom 23 rose 22 jary 26
建表語句:
create external table ex (vals struct<name:string,age:int>)row format delimited collection items terminated by ' ' location '/ex';
查詢語句:
select vals.age from ex where vals.name='tom';
3.運算符
= <> < > <= >= IS NULL IS NOT NULL LIKE RLIKE REGEXP + - * / % & | ^ ~ AND && OR | NOT !
4.函數(略)
概述:
Hive實現了標准的sql,但在這之外,為了提升hive處理數據的能力,還額外提供了很多內置的函數,這些內置函數非常豐富,且可以直接使用,雖然不屬於sql原生的語法,但大大的增強了hive處理數據的能力,是hive功能的重要組成部分
Hive除了有內置函數,還允許用戶自定義函數
a.數學函數
b.類型轉換函數
c.日期函數
d.條件函數
e.字符串函數
f.聚合函數
g.explode
h.自定義函數-UDF
十.Sqoop工具介紹
1.概述:
Sqoop是Apache 提供的工具,用於hdfs和關系型數據庫之間數據的導入和導入
可以從hdfs導出數據到關系型數據庫,也可以從關系型數據庫導入數據到hdfs
2.步驟:
a.准備Sqoop安裝包,官網地址:http://sqoop.apache.org
b.配置JDK環境變量和Hadoop的環境變量
c.解壓Sqoop的安裝包
d.需要將要連接的數據庫的驅動包加入Sqoop的lib目錄下(本例中用的是MySQL數據庫)
e.利用指令操作Sqoop
3.基礎指令:
#查看MySQL所有數據庫
sh sqoop list-databases --connect jdbc:mysql://IP地址:3306/ -username root -password root
#查看指定數據庫下的所有表
sh sqoop list-tables --connect jdbc:mysql://IP地址:3306/hive -username root -password root
#關系型數據庫 ->hdfs
create table tabx (id int,name varchar(20)); insert into tabx (id,name) values (1,'aaa'),(2,'bbb'),(3,'ccc'),(1,'ddd'),(2,'eee'),(3,'fff');
#進入到sqoop的bin目錄下
sh sqoop import --connect jdbc:mysql://IP地址:3306/test --username root --password root --table tabx --target-dir '/sqoop/tabx' --fields-terminated-by '|' -m 1;
#hdfs ->關系型數據庫(Sqoop只能導出數據,不能自動建表。所以在導出之前,要現在MySQL數據庫里建好對應的表)
sh sqoop export --connect jdbc:mysql://192.168.150.138:3306/test --username root --password root --export-dir '/sqoop/tabx/part-m-00000' --table taby -m 1 --fields-terminated-by '|';
#查看import的幫助指令
sh sqoop import -help