hive的基本語法匯總(hql)
hive的基本語法匯總(hql)
——————————————————————————————————————————————
Hive學習3:Hive三種建表語句詳解 https://blog.csdn.net/qq_36743482/article/details/78383964
Hive建表方式共有三種:
1、直接建表法
例如:create table table_name(col_name data_type);
2、查詢建表法
例如:通過AS 查詢語句完成建表:將子查詢的結果存在新表裏,有數據,一般用於中間表
3、like建表法
會創建結構完全相同的表,但是沒有數據。常用語中間表
//詳細解釋見鏈接
Hive文件格式(表STORE AS 的四種類型):https://blog.csdn.net/hereiskxm/article/details/42171325
hive文件存儲格式包括以下幾類:
1、TEXTFILE
2、SEQUENCEFILE //序列文件
3、RCFILE
4、ORCFILE(0.11以後出現)
小結
其中TEXTFILE為默認格式,建表時不指定默認為這個格式,導入數據時會直接把數據文件拷貝到hdfs上不進行處理;
SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接從本地文件導入數據,數據要先導入到textfile格式的表中, 然後再從表中用insert導入SequenceFile,RCFile,ORCFile表中。
小結
1、textfile默認格式,數據不做壓縮,磁盤開銷大,數據解析開銷大。
可結合Gzip、Bzip2使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,hive不會對數據進行切分,
從而無法對數據進行並行操作。
2、SequenceFile是Hadoop API提供的一種二進制文件支持,其具有使用方便、可分割、可壓縮的特點。
SequenceFile支持三種壓縮選擇:NONE,RECORD,BLOCK。Record壓縮率低,一般建議使用BLOCK壓縮。
3、RCFILE是一種行列存儲相結合的存儲方式。首先,其將數據按行分塊,保證同一個record在一個塊上,避免讀一個記錄需要讀取多個block。其次,塊數據列式存儲,有利於數據壓縮和快速的列存取。
總結:
相比TEXTFILE和SEQUENCEFILE,RCFILE由於列式存儲方式,數據加載時性能消耗較大,但是具有較好的壓縮比和查詢響應。數據倉庫的特點是一次寫入、多次讀取,因此,整體來看,RCFILE相比其余兩種格式具有較明顯的優勢。
set hive.cli.print.header=true; //hive客戶端打印頭部
CREATE TABLE page_view(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT ‘IP Address of the User‘)
COMMENT ‘This is the page view table‘
PARTITIONED BY(dt STRING, country STRING) //分區
ROW FORMAT DELIMITED //這句話的意思是,文件裏的一行就是我們這個表中的一條記錄
FIELDS TERMINATED BY ‘\001‘ //我們用‘tab‘作為分隔符
STORED AS SEQUENCEFILE; //存儲為序列文件
//sequencefile
create table tab_ip_seq(id int,name string,ip string,country string)
row format delimited
fields terminated by ‘,‘
stored as sequencefile;
//external 外部表
CREATE EXTERNAL TABLE tab_ip_ext(id int, name string,ip STRING,country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘,‘
STORED AS TEXTFILE
LOCATION ‘/external/user‘;
//從本地導入數據到hive 的表中(實質就是將文件上傳到hdfs 中hive 管理目錄下)
load data local inpath ‘/home/hadoop/ip.txt‘ into table tab_ext;
//從hdfs 上導入數據到hive 表中(實質就是將文件從原始目錄移動到hive 管理的目錄下)
load data inpath ‘hdfs://ns1/aa/bb/data.log‘ into table tab_user;
//使用select 語句來批量插入數據
insert overwrite table tab_ip_seq select * from tab_ext;
//create & load
create table tab_ip(id int,name string,ip string,country string)
row format delimited
fields terminated by ‘,‘
stored as textfile;
// CTAS 根據select 語句建表結構
CREATE TABLE tab_ip_ctas
AS
SELECT id new_id, name new_name, ip new_ip,country new_country FROM tab_ip_ext
SORT BY new_id; //排序方式按照new_id
//CLUSTER <--相對高級一點,你可以放在有精力的時候才去學習> //此部分為分桶表的意思
create table tab_ip_cluster(id int,name string,ip string,country string)
clustered by(id) into 3 buckets; //由(id)聚集成3個桶
load data local inpath ‘/home/hadoop/ip.txt‘ overwrite into table tab_ip_cluster;
set hive.enforce.bucketing=true; //hive執行分桶
insert into table tab_ip_cluster select * from tab_ip;
select * from tab_ip_cluster tablesample(bucket 2 out of 3 on id);
//PARTITION 分區表
create table tab_ip_part(id int,name string,ip string,country string)
partitioned by (year string)
row format delimited
fields terminated by ‘,‘;
load data local inpath ‘/home/hadoop/data.log‘ overwrite into table tab_ip_part
partition(year=‘1990‘);
load data local inpath ‘/home/hadoop/data2.log‘ overwrite into table tab_ip_part
partition(year=‘2000‘);
上面的意思是把/home/hadoop/data2.log數據插入到tab_ip_part下2000的這個分區中
select from tab_ip_part;
select from tab_ip_part where part_flag=‘part2‘;
select count(*) from tab_ip_part where part_flag=‘part2‘;
更改命令
alter table tab_ip change id id_alter string;
ALTER TABLE tab_cts ADD PARTITION (partCol = ‘dt‘) location ‘/external/hive/dt‘;
show partitions tab_ip_part; //查看分區情況
HIVE-分桶表的詳解和創建實例 https://www.cnblogs.com/kouryoushine/p/7809299.html
Hive的分區表和分桶表的區別 https://blog.csdn.net/jenrey/article/details/80588493
Hive 基礎之:分區、桶、Sort Merge Bucket Join https://blog.csdn.net/wisgood/article/details/17186107
hive的分區分桶為高級功能,可以深入學習了解 (參考xinghuan資料)
//insert from select 通過select 語句批量插入數據到別的表
create table tab_ip_like like tab_ip;
insert overwrite table tab_ip_like select * from tab_ip;
//write to hdfs 將結果寫入到hdfs 的文件中
insert overwrite local directory ‘/home/hadoop/hivetemp/test.txt‘ select from tab_ip_part where part_flag=‘part1‘;
insert overwrite directory ‘/hiveout.txt‘ select from tab_ip_part where part_flag=‘part1‘;
//cli shell 通過shell 執行hive 的hql 語句
hive -S -e ‘select country,count() from tab_ext‘ > /home/hadoop/hivetemp/e.txt
select from tab_ext sort by id desc limit 5;
select a.ip,b.book from tab_ext a join tab_ip_book b on(a.name=b.name);
hive復雜格式array,map,struct使用 : https://blog.csdn.net/u010670689/article/details/72885944
//array 數組
create table tab_array(a array<int>,b array<string>)
row format delimited
fields terminated by ‘\t‘
collection items terminated by ‘,‘;
select a[0] from tab_array;
select * from tab_array where array_contains(b,‘word‘);
insert into table tab_array select array(0),array(name,ip) from tab_ext t;
Hive中數組的使用 https://blog.csdn.net/zhao897426182/article/details/78347960
//map //映射
create table tab_map(name string,info map<string,string>)
row format delimited
fields terminated by ‘\t‘
collection items terminated by ‘,‘ //收集物品終止,
map keys terminated by ‘:‘; //映射鍵終止
load data local inpath ‘/home/hadoop/hivetemp/tab_map.txt‘ overwrite into table tab_map;
insert into table tab_map select name,map(‘name‘,name,‘ip‘,ip) from tab_ext;
//struct
create table tab_struct(name string,info struct<age:int,tel:string,addr:string>)
row format delimited
fields terminated by ‘\t‘
collection items terminated by ‘,‘
load data local inpath ‘/home/hadoop/hivetemp/tab_st.txt‘ overwrite into table tab_struct;
insert into table tab_struct select name,named_struct(‘age‘,id,‘tel‘,name,‘addr‘,country) from tab_ext;
//UDF 函數 這一步運維人員可以忽略,有興趣可以學習
select if(id=1,first,no-first),name from tab_ext;
hive>add jar /home/hadoop/myudf.jar;
hive>CREATE TEMPORARY FUNCTION fanyi AS ‘cn.itcast.hive.Fanyi‘;
select id,name,ip,fanyi(country) from tab_ip_ext;
Hive的UDF是什麽 https://blog.csdn.net/yqlakers/article/details/70211522
首先什麽是UDF,UDF的全稱為user-defined function,用戶定義函數,為什麽有它的存在呢?有的時候 你要寫的查詢無法輕松地使用Hive提供的內置函數來表示,通過寫UDF,Hive就可以方便地插入用戶寫的處理代碼並在查詢中使用它們,相當於在HQL(Hive SQL)中自定義一些函數。首先UDF必須用java語言編寫,Hive本身就是用java寫的。所以想學好hadoop這個分布式框架的相關技術,熟練使用java就是基本功了!
作者:YQlakers
來源:CSDN
原文:https://blog.csdn.net/yqlakers/article/details/70211522
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
hql查詢進階 //hive的查詢語法
hive中order by,sort by, distribute by, cluster by作用以及用法 :https://blog.csdn.net/jthink_/article/details/38903775
MapReduce 腳本
連接(join)
內連接(inner join)
外連接(outer join)
半連接(semi join)
Map 連接(map join)
子查詢(sub query)
視圖(view)
通過Hive 提供的order by 子句可以讓最終的輸出結果整體有序。但是因為Hive是基於Hadoop 之上的,要生成這種整體有序的結果,就必須強迫Hadoop 只利用一個Reduce 來完成處理。這種方式的副作用就是回降低效率。
如果你不需要最終結果整體有序,你就可以使用sort by 子句來進行排序。這種排序操作只保證每個Reduce 的輸出是有序的。如果你希望某些特定行被同一個Reduce 處理,則你可以使用distribute(分發) 子句來完成。比如:
表student(classNo,stuNo,score)數據如下:
C01 N0101 82
C01 N0102 59
C02 N0201 81
C01 N0103 65
C03 N0302 92
C02 N0202 82
C02 N0203 79
C03 N0301 56
C03 N0306 72
我們希望按照成績由低到高輸出每個班級的成績信息。執行以下語句:
Select classNo,stuNo,score from student distribute byclassNo sort by score;
輸出結果為:
C02 N0203 79
C02 N0201 81
C02 N0202 82
C03 N0301 56
C03 N0306 72
C03 N0302 92
C01 N0102 59
C01 N0103 65
C01 N0101 82
我們可以看到每一個班級裏所有的學生成績是有序的。因為同一個classNo 的記錄會被分發到一個單獨的reduce 處理,而同時sort by 保證了每一個reduce的輸出是有序的。
註意:
為了測試上例中的distribute by 的效果,你應該首先設置足夠多的reduce。比如上例中有3 個不同的classNo,則我們需要設置reduce 個數至少為3 或更多。如果設置的reduce 個數少於3,將會導致多個不同的classNo 被分發到同
一個reduce,從而不能產生你所期望的輸出。設置命令如下:
set mapred.reduce.tasks = 3;
MapReduce 腳本
如果我們需要在查詢語句中調用外部腳本,比如Python,則我們可以使用
transform(轉變),map,reduce 等子句。
比如,我們希望過濾掉所有不及格的學生記錄,只輸出及格學生的成績信息。
新建一個Python 腳本文件score_pass.py,內容如下:
#! /usr/bin/env python
import sys
for line in sys.stdin:
(classNo,stuNo,score)= line.strip().split(‘\t‘)
ifint(score) >= 60:
print"%s\t%s\t%s" %(classNo,stuNo,score)
執行以下語句
add file /home/user/score_pass.py;
select transform(classNo,stuNo,score) using‘score_pass.py‘ as classNo,stuNo,score from student;
輸出結果為:
C01 N0101 82
C02 N0201 81
C01 N0103 65
C03 N0302 92
C02 N0202 82
C02 N0203 79
C03 N0306 72
註意:
1) 以上Python 腳本中,分隔符只能是制表符(\t)。同樣輸出的分隔符也必須為制表符。這個是有hive 自身決定的,不能更改,不要嘗試使用其他分隔符,否則會報錯。同時需要調用strip 函數,以去除掉行尾的換行符。(或者直接使用不帶參數的line.split()代替。
2) 使用腳本前,先使用add file 語句註冊腳本文件,以便hive 將其分發到Hadoop 集群。
3) Transfom 傳遞數據到Python 腳本,as 語句指定輸出的列。
連接(join)
直接編程使用Hadoop 的MapReduce 是一件比較費時的事情。Hive 則大大簡化了這個操作。
內連接(inner join)
和SQL 的內連相似。執行以下語句查詢每個學生的編號和教師名:
Select a.stuNo,b.teacherName from student a join teacherb on a.classNo = b.classNo;
輸出結果如下:
N0203 Sun
N0202 Sun
N0201 Sun
N0306 Wang
N0301 Wang
N0302 Wang
N0103 Zhang
N0102 Zhang
N0101 Zhang
註意:
數據文件內容請參照上一篇文章。
不要使用select xx from aa,bb where aa.f=bb.f 這樣的語法,hive 不支持這種寫法。
如果需要查看hive 的執行計劃,你可以在語句前加上explain,比如:
explain Select a.stuNo,b.teacherName from student a jointeacher b on a.classNo = b.classNo;
外連接(outer join)
和傳統SQL 類似,Hive 提供了left outer join,right outer join,full out join。
半連接(semi join)
Hive 不提供in 子查詢。此時你可以用leftsemi join 實現同樣的功能。執行以下語句:
Select * from teacher left semi join student onstudent.classNo = teacher.classNo;
輸出結果如下:
C02 Sun
C03 Wang
C01 Zhang
可以看出,C04 Dong 沒有出現在查詢結果中,因為C04 在表student 中不存在。
註意:
右表(student)中的字段只能出現在on 子句中,不能出現在其他地方,比如不能出現在select 子句中。
Map 連接(map join)
當一個表非常小,足以直接裝載到內存中去時,可以使用map 連接以提高效率,
比如:
Select /+mapjoin(teacher) / a.stuNo,b.teacherNamefrom student a join teacher b on a.classNo = b.classNo;
以上紅色標記部分采用了C 的註釋風格。
當連接時用到不等值判斷時,也比較適合Map 連接。具體原因需要深入了解Hive和MapReduce 的工作原理。
子查詢(sub query)
運行以下語句將返回所有班級平均分的最高記錄。
Select max(avgScore) as maScore from
(Select classNo,avg(score) as avgScore from student group byclassNo) a;
輸出結果:
80.66666666666667
以上語句中紅色部分為一個子查詢,且別名為a。返回的子查詢結果和一個表類似,可以被繼續查詢。
視圖(view)
和傳統數據庫中的視圖類似,Hive 的視圖只是一個定義,視圖數據並不會存儲到文件系統中。同樣,視圖是只讀的。
運行以下兩個命令:
Create view avg_score as
Select classNo,avg(score) as avgScore from student groupby classNo;
Select max(avgScore) as maScore From avg_score;
可以看到輸出結果和上例中的結果是一樣的。
hive 數據類型
---基本類型
---復合類型
hive的基本語法匯總(hql)