Hive入門學習隨筆(二)

愛吃串串的瘦子發表於2018-07-20

 

====使用Load語句執行資料的匯入

--將作業系統上的檔案student01.txt資料匯入到t2表中

load data local inpath '/root/data/student01.txt' into table t2;

--將作業系統上/root/data資料夾下的所有檔案匯入t3表中,並且覆蓋原來的資料

load data local inpath '/root/data/' overwrite into table t3;

--將HDFS中,/input/student01.txt匯入到t3表中

load data inpath '/input/student01.txt' overwrite into table t3;

--將作業系統上的data1.txt匯入到分割槽t3表中

load data local inpath 'root/data/data1.txt' into table t3 partition (gender='M')

===使用Sqoop實現資料的匯入

Sqoop是一個工具,用來進行Hadoop與關係型資料之間的批量資料的匯入和匯出。

Sqoop的安裝非常簡單,只需要從網站上下載Sqoop的安裝包,並配置環境變數即可。

官網:http://sqoop.apache.org

環境變數:

由於Sqoop是基於Hadoop的,所以需要通過環境變數HADOOP_COMMON_HOME來指明Hadoop的安裝目錄。

由於Sqoop是把作業最終轉換成MapReduce的作業進行提交執行,所以,需要通過環境變數HADOOP_MAPRED_HOME來指明MapReduce的Jar目錄。

--使用Sqoop匯入Oracle資料到HDFS中。

./sqoop import --connect jdbc:oracle:thin:@192.168.1.36:1521:orcl --username xxx --password xxx --table emp --columns 'empno,ename,job,sal' -m 1 --target-dir '/sqoop/emp'

--使用Sqoop匯入Oracle資料到Hive中。

./sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.1.36:1521:orcl --username xxx --password xxx --table emp --columns 'empno,ename,job,sal' -m 1 

--使用Sqoop匯入Oracle資料到Hive中,並且指定表名

./sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.1.36:1521:orcl --username xxx --password xxx --table emp --columns 'empno,ename,job,sal' -m 1  --hive-table emp1

使用Sqoop匯入Oracle資料到Hive中,並且制定Where條件

./sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.1.36:1521:orcl --username xxx --password xxx --table emp --columns 'empno,ename,job,sal' -m 1  --hive-table emp1 --where 'DEPTNO=10'

--使用Sqoop匯入Oracle資料到Hive中,並且使用查詢語句

./sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.1.36:1521:orcl --username xxx --password xxx --table emp --columns 'empno,ename,job,sal' -m 1  --hive-table emp1 --query 'SELECT * FROM EMP WHERE SAL<2000 $CONDITIONS' --target-dir '/sqoop/emp5' --hive-table emp5

--使用Sqoop將Hive中的資料匯出到Oracle中。

./sqoop export --connect jdbc:oracle:thin:@192.168.1.36:1521:orcl --username xxx --password xxx -m 1 --table MYEMP --export-dir HDFS路徑

Sqoop在業務系統中有著非常重要的作用,一般的應用場景是下面這個樣子。

 

====Hive的資料查詢

--查詢所有員工的所有資訊

select * from emp;

--查詢員工資訊:員工號 姓名 月薪

select empno, ename, sal from emp;

--查詢員工資訊:員工號 姓名 月薪 年薪 獎金 年收入

select empno, ename, sal, sal*12 comm, sal*12+nvl(comm, 0) from emp;

--查詢獎金為null的員工

select * from emp where comm is null;

--使用distinct來去掉重複記錄

select distinct deptno from rmp;

====Hive簡單查詢的FetchTask功能

從Hive0.10.0版本開始支援。開始了這個功能以後,我們執行一條簡單的語句(沒有函式、排序等)不會生成一個MapReduce作業。

hive-site.xml配置內容:

 

====在查詢中使用過濾

--查詢10號部門的員工

select * from emp where deptno=10;

--查詢名稱為KING的員工

select * from emp where ename='KING';

--查詢部門號是10,薪水小於2000的員工

select * from emp where deptno=10 and sal<2000;

--模糊查詢:查詢名字以S開頭的員工

select empno, ename, sal from emp where ename like 'S%';

--模糊查詢:查詢名字含有下劃線的員工

select empno, ename, sal from emp where ename like '%\\_%';

注意:下劃線在模糊查詢中有特殊的含義,代表任意字元。所以,語句中需要轉義符進行標記

====在查詢中使用排序

--查詢員工資訊:員工號 姓名 月薪 按照月薪排序

select empno, ename, sal from emp order by sal desc;

※order by後面可以使用:列名、表示式、別名、序號。

另外,如果想使用需要進行排序的時候,需要設定下面的環境變數。

set hive.groupby.orderby.position.alias=true;

※null排序:升序時null排最前面,降序時null排最後面,一般用法都是將null轉換成0之後進行排序。

====Hive的函式

內建函式可以直接呼叫。也可以通過編寫java程式來自定義函式

--內建函式

 

--自定義函式

①、自定義UDF需要繼承org.apache.hadoop.hive.ql.UDF

需要實現evaluate函式,evaluate函式支援過載。

 

②、將程式打包放到目標機器上去,進入Hive客戶端新增jar包

命令例:hive>add jar /root/udfjar/udf_text.jar 

③、建立臨時函式:CREATE TEMPORARY FUNCTION <函式名> AS 'java類名'

命令例:hive>CREATE TEMPORARY FUNCTION myconcat AS 'demo.udf.ConcatString';

④、自動以函式使用。select <函式名> from table;

 

⑤、銷燬臨時函式:DROP TEMPORARY FUNCTION <函式名>

====Hive表連線

Hive的表連線分為:等值連線、不等值連線、外連結、自連線

--等值連線

select e.empno, e.ename, e.sal, d.name from emp e, dept d where e.deptno=d.deptno;

--不等值連線

select e.empno, e.ename, e.sal, s.grade from emp e, salgrade s where e.sal between s.local and s.hisal;

--外連結(包括左連線和右連線)

select d.deptno, d.dname, count(e.empno) from emp e right outer join dept d on (e.deptno=d.deptno) group by d.deptno, d.dname;

--自連線

核心:通過表的別名將同一張表視為多張表

====Hive中的子查詢

hive只支援from和where子句中的子查詢。

例:select e.ename from emp e where e.deptno in (select d.deptno from dept d where d.dname='SALES' or d.dname='KING');

注意:子查詢中的空值:如果子查詢返回的結果集中含有空值得話,我們不能使用not in,但是可以使用in。

====Hive的JDBC客戶端操作

①、啟動Hive遠端服務。命令:#hive --service hiveserver

②、JDBC客戶端操作

 

====Hive的Thrift Java客戶端操作

相關文章