1. 程式人生 > >Hive-2.HiveQL查詢中常用函式

Hive-2.HiveQL查詢中常用函式

1. SELECT ....FROM 語句

1、建立表

CREATE EXTERNAL TABLE employees(

ID STRING,

name STRING,

AGE INT,

BIRTHDAY DATE,

subordinates ARRAY<STRING>,

score MAP<STRING,FLOAT>,

address STRUCT<street:STRING,city:STRING,province:STRING>

)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\t'

COLLECTION ITEMS TERMINATED BY ','

MAP KEYS TERMINATED BY ':';

2、插入資料

2.1 vi employees.txt

g201425003 wangwu1 5500 20 1987-07-12 zhaoliu1,wangwu1 Chinese:90,English:88 國營1,西直門,北京

g201425004 wangwu2 6400 20 1987-07-12 zhaoliu2,wangba2 Japana:85,English:60 國營2,西直門2,北京

g201425005 wangwu3 8400 20 1987-07-12 zhaoliu3,wangba3 Japana:80,English:70 高碑店,保定市,河北

g201425006 wangwu4 8400 20 1987-07-12 zhaoliu4,wangba4 Japana:80,English:70 高碑店,

保定市,河北

2.2 上傳hdfs

hdfs dfs -put employees.txt

3、載入資料到employees

load  data  inpath 'employees.txt' OVERWRITE into table employees partition(country='China');

4、查詢資料

4.1 一般查詢

select * from employees;

4.2 對複合字段獲取

select name ,subordinates[0] subordinate ,score['English'] English ,address.street,address.city  from employees;

4.3 複合函式欄位檢視

select name ,subordinates ,score ,address  from employees;

查詢結果:

name     subordinates     score    address

zhangsan        ["lisi","wangwu"]       {"Chinese":90.0,"English":88.0} {"street":"國營1","city":"西直門","province":"北京"}

wangwu   ["zhaoliu","wangba"]    {"Japana":90.0,"English":88.0}  {"street":"國營2","city":"西直門2","province":"北京"}

wangwu   ["zhaoliu","wangba"]    {"Japana":90.0,"English":88.0}  {"street":"高碑店","city":"保定市","province":"河北"}

通過以上結果得出結果:

l ARRAY欄位通過集合方式展示,通過下表獲取每個欄位的數值,是有序儲存。

l MapSTRUCT欄位通過json方式儲存,其中:Map通過[‘key’],STRUCT通過.來獲取欄位內容。

2.1 UPPER函式和map_values函式使用

 select upper(name) from employees;

 select map_values(score) from employees;

2.2 使用函式

2.2.1 聚合函式

最常用的兩類聚合函式: countavg

select count(id),round(avg(salary),2) avg_salary from employees;

2.2.2explode函式

ARRAYMap符合型別的欄位通過explode函式可以讓一行轉化成多行。

explode(ARRAY array)

explode(Map map)

2.2.3lpadrpad函式

語法: lpad(STRING s,INT len,STRING pad)

S:輸入字串

len:輸出結果的字串長度

pad:顯示len的長度,不夠長度通過lpad(rpad)從左(右)開始補齊

select name,lpad(name,8,'*') lname, rpad(name,8,'*') rname from employees;

查詢結果:

name     lname    rname

zhangsan        zhangsan        zhangsan

wangwu   **wangwu        wangwu**

wangwu   **wangwu        wangwu**

2.2.4 字串拼接

l 拼接多個字串

語法: concat(STRING s1, STRINGs2,STRING s3.....)

示例: select name,concat(name,'_china','_sx') from employees;

輸出結果:

name    _c1

zhangsan        zhangsan_china_sx

wangwu  wangwu_china_sx

wangwu  wangwu_china_sx

l 使用分隔符進行拼接字串(功能同concat類似)

語法: concat_ws()

示例:select name,concat_ws('|',name,'nan','2000') from employees;

結果:

name     _c1

zhangsan        zhangsan|nan|2000

wangwu   wangwu|nan|2000

wangwu   wangwu|nan|200

2.2.5 反轉字串函式

語法:reverse(STRING s)

示例:select name,reverse(name) from employees;

結果:

name    _c1

zhangsan        nasgnahz

wangwu  uwgnaw

wangwu  uwgnaw

2.2.6 獲取ARRAYMAP複合型別欄位元素個數

語法:size(ARRAY array)    size(MAP map)

示例:

select subordinates,size(subordinates) array_count,score,size(score) map_count from employees;

結果:

subordinates          array_count     score                      map_count

["lisi","wangwu"]       2              {"Chinese":90.0,"English":88.0}   2

["zhaoliu","wangba"]    2              {"Japana":85.0,"English":60.0}   2

["zhaoliu","wangba"]    2              {"Japana":80.0,"English":70.0}   2

2.2.7 split分割函式

語法:split(STRING s,STRING pattern)

按照正則表示式pattern分割 字串,返回分割後的字串陣列ARRAY

示例:select split("I|am|a|student",'\\|') from employees limit 1;

結果:

["I","am","a","student"]

2.2.8通過parse_url解析url字串

語法:parse_url(STRING url,STRING partname[,STRINGkey])

示例:

select parse_url('http://item.jd.com/1856588.html','HOST') host, parse_url('http://item.jd.com/1856588.html','PROTOCOL') PROTOCOL from employees limit 1;

結果:

host           protocol

item.jd.com     http

2.2.9 str_to_map函式將字串轉為Map

語法:str_to_map(STRING s,STRING delimi1,STRING delimi2)

第一引數: 要轉換的字串

第二引數:鍵值對之間的分割符

第三引數:鍵和值之間的分割符

示例:

select score,str_to_map('Chinese:90.0,English:88.0',',',':') strMap,str_to_map('Chinese:90.0,English:88.0',',',':')['Chinese'] Chinese from employees;

結果:

{"Chinese":90.0,"English":88.0} {"Chinese":"90.0","English":"88.0"}     90.0

2.2.10 substr擷取字串函式

語法:substr(STRINGs,開始下標,擷取長度)

示例:select substr('20160106112134432',0,8) day from  employees limit 1;

結果:20160106

2.2.11時間基本函式

l 獲取當前時間

語法:unix_timestamp()獲取當前時間的時間戳

l 指定時間戳轉為指定的格式字串

語法:from_unixtime(BIGINT unixtime,String format)

按照format的格式對時間戳進行格式化,返回STRING字串

示例:

select unix_timestamp() currentUnixTime,from_unixtime(unix_timestamp(),'yyyy-MM-dd') formatCurrentTime from employees limit 1;

結果:

1452051408      2016-01-05 19:36:48

l 指定格式字串轉為時間戳

語法:unix_timestamp(STRING date,STRING pattern)

 將指定格式字串轉為時間戳

示例:

select unix_timestamp('2016-01-05 19:36:48','yyyy-MM-dd HH:mm:ss') from employees limit 1;

結果:

1452051408

l 獲取指定字串的日期,年,月,日,時,分,秒

示例:

select d ,to_date(d) ri,year(d) y,month(d) m,day(d) ri,hour(d) h,minute(d) m,second(d) s from t1;

結果:

d                ri       y       m       ri      h       m       s

2016-01-05 19:36:48  2016-01-05      2016    1       5       19    36      48

2.2.12日期計算函式

l 計算開始時間和結束時間相差的天數

語法:datediff(STRING enddate,STRING startdate)

通過測試,僅計算yyyy-MM-dd格式的字串

示例:select datediff('2016-01-05','2016-01-02') from t1;

結果:3

2.2.12 limit語句

典型的查詢會返回多行資料。Limit子句用於限制返回的行數:

select * from employees limit 2;

2.2.13巢狀SELECT語句

對於巢狀語句來說,使用別名時候非常有用的。下面,我們使用前面的示例作為一個巢狀查詢:

from (

select name,salary, address.street as street,address.city as city,address.province as provice from employees

) e

select e.name,e.salary,e.city

where e.salary>1000

name    salary  street  city    provice

zhangsan        1200.5  國營1號 西直門  北京

wangwu  890.4   國營2號 西直門北京

wangwu  800.0   高碑店  保定市  河北

2.2.14 CASE…WHEN…THEN 語句

該表達方式和if語句類似,用於處理多個列的查詢結果。

select name,salary,case when salary<6000 then 'low' WHEN salary >= 6400 AND salary<8000 THEN 'middle' WHEN salary >= 8000 AND  salary<9000 THEN 'high'  else 'other' end as bracket from employees;

輸出結果:

name    salary  bracket

wangwu1 5500.0  low

wangwu2 6400.0  middle

wangwu3 8400.0  high

wangwu4 8400.0  high

2.2.15 何種情況避免MapReduce

如果使用者進行執行一般的HQL的話,可能會注意到大多數情況查詢都會觸發一個MapReduce任務(job)。Hive中對於某些情況的查詢可以不必要使用MapReduce,也就是所謂的本地模式。例如:

select * from t1;

在這種情況下,Hive可以讀取t1對應的儲存目錄下的檔案,然後輸出格式化後的內容到控制檯。

對於where語句中過濾條件知識分割槽欄位這種情況無需轉為MapReduce過程(一般要設計好分割槽,這樣檢視可以避免MapReduce)。例如:

select *from employees where country='China';

此外,通過設定Hive的本地模式,可以提高Hive查詢的效率。但本地模式需要一些條件。當一個job滿足如下條件才能真正使用本地模式:

1.job的輸入資料大小必須小於引數:hive.exec.mode.local.auto.inputbytes.max(預設128MB)

2.jobmap數必須小於引數:hive.exec.mode.local.auto.tasks.max(預設4)

3.jobreduce數必須為0或者1

實驗1: 非本地模式執行

hive (default)> select name from employees;

Total jobs = 1

Launching Job 1 out of 1

Number of reduce tasks is set to 0 since there's no reduce operator

Starting Job = job_1452047254290_0045, Tracking URL = http://mycluster:8088/proxy/application_1452047254290_0045/

Kill Command = /home/hadoop/app/hadoop-2.6.0/bin/hadoop job  -kill job_1452047254290_0045

Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0

2016-01-05 22:41:36,714 Stage-1 map = 0%,  reduce = 0%

2016-01-05 22:41:46,020 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 1.21 sec

MapReduce Total cumulative CPU time: 1 seconds 210 msec

Ended Job = job_1452047254290_0045

MapReduce Jobs Launched: 

Job 0: Map: 1   Cumulative CPU: 1.21 sec   HDFS Read: 649 HDFS Write: 32 SUCCESS

Total MapReduce CPU Time Spent: 1 seconds 210 msec

OK

name

wangwu1

wangwu2

wangwu3

wangwu4

Time taken: 27.942 seconds, Fetched: 4 row(s)

實驗2: 設定本地模式執行

hive> set hive.exec.mode.local.auto=true; 

hive> set hive.exec.mode.local.auto.inputbytes.max=50000000;

hive> set hive.exec.mode.local.auto.tasks.max=10;

hive (default)> select name from employees;

Automatically selecting local only mode for query

Total jobs = 1

Launching Job 1 out of 1

Number of reduce tasks is set to 0 since there's no reduce operator

Job running in-process (local Hadoop)

Hadoop job information for null: number of mappers: 0; number of reducers: 0

2016-01-05 22:43:11,738 null map = 100%,  reduce = 0%

Ended Job = job_local2070598612_0001

Execution completed successfully

MapredLocal task succeeded

OK

name

wangwu1

wangwu2

wangwu3

wangwu4

Time taken: 10.77 seconds, Fetched: 4 row(s)

注意: Hive的本地模式,最好將set hive.exec.mode.local.auto=true; 這個設定增加到你的$HOME/.hiverc配置檔案中。(其中:$HOME hive當前按照目錄)

相關推薦

Hive-2.HiveQL查詢常用函式

1. SELECT ....FROM 語句 1、建立表 CREATE EXTERNAL TABLE employees( ID STRING, name STRING, AGE INT, BIRTHDAY DATE, subordinates ARRAY<STRIN

mysql查詢常用函式整理

整理出部分常用的函式,不是全部,後面會繼續補充。 函式名 函式含義 特殊說明 Upper() 小寫字元轉換為大寫 Lowwer() 大寫字元轉換為小寫

關於Hive常用函式需要注意的點小合集

開發十年,就只剩下這套架構體系了! >>>   

Makefile常用函式

Makefile常用函式總結 1、realpath  返回一個絕對路徑 例:ROOT  = $(realpath ./)  返回當前路徑的絕對地址,賦值給ROOT 2、wildcard 萬用字元函式,類似於linux中的 “*” 命令格式: $(

【sql語句】實驗三 SQL*Plus 常用函式

save C:\Users\DH2016PSY\Desktop\資料庫PPT18\SY3\SY3.sql; save C:\Users\DH2016PSY\Desktop\資料庫PPT18\SY3\SY3.sql append; 1.ASCII:返回與指定的字元對應的ASCII碼。

JQuery常用函式

說出JQuery中常見的幾種函式以及他們的含義是什麼? jQuery中常見的函式如下: (1)get()取得所有匹配的DOM元素集合。 (2)get(index)取得其中一個匹配的元素。index表示取得第幾個匹配的元素。 (3)append(content)向

c語言常用函式

memset void *memset(void *s, int ch, size_t n); 函式解釋:將s中當前位置後面的n個位元組 (typedef unsigned int size_t )

Oracle在查詢使用函式

一 在查詢中使用字元函式 1、需求 在員工資訊表中查詢出員工的生日,根據員工身份證號碼得到生日。 2、例項 SQL>select*from users; ID NAME

STL常用函式

STL容器Stack標頭檔案寫:#include<stack>定義: stack <TYPE> StackName;成員函式:成員函式功能bool empty()棧為空返回true,否則返回falsevoid pop()刪除棧頂元素,即出棧void p

C++ vector的用法及algorithm.h常用函式

c++ vector用法 C++內建的陣列支援容器的機制,但是它不支援容器抽象的語義。要解決此問題我們自己實現這樣的類。在標準C++中,用容器向量(vector)實現。容器向量也是一個類模板。 標準庫vector型別使用需要的標頭檔案:#include <vector>。vector 是一個

MATLAB常用函式

一 . matalab 中的zeros()函式和ones()函式 zeros()函式用來生成全0矩陣 ones()函式用來生成全1矩陣 zeros()函式的具體用法如下: zer

C++標頭檔案algorithm常用函式測試

目錄 1.max(),min(),abs()測試 2.swap()測試 3.reverse()測試 4.next_permutation()測試 5.fill()測試 6.sort()測試

字串常用函式

 strlen():用於統計字串的長度。  strlen和sizeof之間的區別:      a、strlen()是一個函式,sizeof是一個運算子,這是本質上的區別​            b、strlen()測量的是字元的是實際長度,以'\0'結束;如果只定義沒有

Oracle之單表查詢常用函式

1.語法:   select 欄位列表   from 表名   [where 查詢條件]   [group by 分組]   [having 分組條件]   [order by 排序] select * 代表查詢所有的欄位 select

string常用函式總結四(append和assign)(C++11)

append(新增字元(串)) (1)basic_string& append(const basic_string& __str); //在字串末尾新增字串str (2) basic_string& append(const basic_st

MFC常用函式總結

1、MFC編輯框、靜態文字框相關的常用函式 《1》GetDlgItemText(ID ,str) 作用:從對話方塊中獲取文字 第一個引數為要獲取的編輯框(或者靜態文字框、單選按鈕等可以顯示內容的控制元件)的ID,第二個引數為字串(Cstring 型別)的變數,獲取的文字

Oracle_子查詢常用函式

1、子查詢 子查詢在 SELECT、UPDATE、DELETE 語句內部可以出現 SELECT 語句。內部的 SELECT 語句結果可以作為外部語句中條件子句的一部分,也可以作為外部查詢的臨時表。子查詢的型別有: 單行子查詢:不向外部返回結果,或者只返回一行結果。 多行

一、Oracle之單表查詢常用函式

一、Oracle概念 1. 資料庫 Oracle 資料庫是資料的物理儲存。這就包括(資料檔案 ORA 或者 DBF、控制檔案、聯機日誌、引數檔案)。其實 Oracle 資料庫的概念和其它資料庫不一樣,這裡的資料庫是一個作業系統只有一個庫。可以看作是 Ora

sql server常用函式集錦(整理)

1、聚合函式   這個對於有sql 基礎的人來說,實在再熟悉不過了,在這簡單說明一下,sum,avg,max,min,count,聚合函式不統計值為null的行,我們可以通過distinct過濾掉重複的記錄,也可以通過group by 分組。Count 函式不數帶有 Nul

oracle 之在查詢使用函式

1、在查詢中使用字元函式 如:在員工資訊表中查詢出員工的生日 select substr(cardid, 7,8) from users; 將部門號01全部替換成 ‘資訊科技’ select r