天天看點

Hive常見語句及函數

一、資料庫

1 建立庫語句

CREATE DATABASE [IF NOT EXISTS] database_name

[COMMENT database_comment]

[LOCATION hdfs_path]

[WITH DBPROPERTIES (property_name=property_value, ...)];

2查詢資料庫

2.1 顯示資料庫

show databases;

Hive常見語句及函數

2.2 過濾顯示查詢的資料庫

show databases like 'd*';

Hive常見語句及函數

2.3 顯示資料庫資訊

desc database ods;

Hive常見語句及函數

2.4 顯示資料庫詳細資訊,extended

desc database extended ods;

Hive常見語句及函數

2.5 切換資料庫詳細資訊,use

use dwd;

3 修改資料庫

3.1 修改資料庫屬性,Alter

ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, …);

3.2 删除資料庫,drop

3.2.1 删除空的資料庫

drop database dwd;

3.2.2删除非空的資料庫,使用cascade強制删除。

drop database dwd cascade;

二、表

1 建表語句

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

[(col_name data_type [COMMENT col_comment], ...)]

[COMMENT table_comment]

[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]

[CLUSTERED BY (col_name, col_name, ...)

[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

[ROW FORMAT row_format]

[STORED AS file_format]

[TBLPROPERTIES (property_name=property_value, ...)]

[AS select_statement]

(1)CREATE TABLE 建立一個指定名字的表。如果相同名字的表已經存在,則抛出異常;使用者可以用 IF NOT EXISTS 選項來忽略這個異常。

(2)EXTERNAL關鍵字可以讓使用者建立一個外部表,在建表的同時可以指定一個指向實際資料的路徑(LOCATION),在删除表的時候,内部表的中繼資料和資料會被一起删除,而外部表隻删除中繼資料,不删除資料。

(3)COMMENT:為表和列添加注釋。

(4)PARTITIONED BY建立分區表

(5)CLUSTERED BY建立分桶表

(6)SORTED BY不常用,對桶中的一個或多個列另外排序

(7)ROW FORMAT

DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]

[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]           

| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

使用者在建表的時候可以自定義SerDe或者使用自帶的SerDe。如果沒有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将會使用自帶的SerDe。在建表的時候,使用者還需要為表指定列,使用者在指定表的列的同時也會指定自定義的SerDe,Hive通過SerDe确定表的具體的列的資料。

SerDe是Serialize/Deserilize的簡稱, hive使用Serde進行行對象的序列與反序列化。

(8)STORED AS指定存儲檔案類型

常用的存儲檔案類型:SEQUENCEFILE(二進制序列檔案)、TEXTFILE(文本)、RCFILE(列式存儲格式檔案)

如果檔案資料是純文字,可以使用STORED AS TEXTFILE。如果資料需要壓縮,使用 STORED AS SEQUENCEFILE。

(9)LOCATION :指定表在HDFS上的存儲位置。

(10)AS:後跟查詢語句,根據查詢結果建立表。

(11)LIKE允許使用者複制現有的表結構,但是不複制資料。

(12)TBLPROPERTIES設定表的屬性,在表明壓縮類型時用過。(例如”orc.compress”=”SNAPPY”)

2 查詢表資訊

2.1 檢視表的中繼資料資訊 desc

DESCRIBE FORMATTED orders;

Hive常見語句及函數

2.2 修改 alter

2.2.1 修改表名: alter table dept rename to depts;

2.2.2 修改表屬性:

alter table depts set tblproperties ('EXTERNAL'='TRUE')

alter table depts set tblproperties ('EXTERNAL'='FALSE')

2.2.3 修改列,注意如果修改的字段類型和之前的字段類型不一緻,之前的資料就無法顯示

修改列名和列資料類型:alter table depts change dept_name dname string ;

修改位置放置第一位:alter table depts change id did string first;

修改位置指定某一列後面:alter table depts change dname dname string after did;

2.2.4 添加列(慎用)

alter table depts add columns(daddress string);

2.2.5 添加分區

alter table depts add partition(dt=20200713);

alter table depts add partition(dt=20200713) location '/user/test/20200713.txt';

2.2.6 修改分區

alter table depts partition(dt=20170404) rename to partition(dt=20170405);

alter table depts partition(dt=20170404) set location '/user/test/depts.txt';

2.2.7 删除分區

alter table depts drop if exists partition(dt=20170404);

2.3 查詢表資料

Hive中的SELECT基礎文法和标準SQL文法基本一緻,支援WHERE、DISTINCT、GROUP BY、ORDER BY、HAVING、LIMIT、子查詢等;

具體文法:

[WITH CommonTableExpression (, CommonTableExpression)*]

SELECT [ALL | DISTINCT] select_expr, select_expr, ...

FROM table_reference

[WHERE where_condition]

[GROUP BY col_list]

[CLUSTER BY col_list

| [DISTRIBUTE BY col_list] [SORT BY col_list]

]

[LIMIT number]

2.3.1 常用關鍵詞簡介

(1) ORDER BY和SORT BY

ORDER BY用于全局排序,就是對指定的所有排序鍵進行全局排序,使用ORDER BY的查詢語句,最後會用一個Reduce Task來完成全局排序。

explain select id,name from emp where deptid = 1001

Hive常見語句及函數

explain select id,name from emp where deptid = 1001 order by id

Hive常見語句及函數

SORT BY用于分區内排序,即每個Reduce任務内排序。

Hive常見語句及函數
Hive常見語句及函數

設定了2個reduce,從結果可以看出,每個reduce内做了排序。設定一個reduce,從結果看和order by一緻。

(2)DISTRIBUTE BY和CLUSTER BY

distribute by:按照指定的字段或表達式對資料進行劃分,輸出到對應的Reduce或者檔案中。

cluster by:除了兼具distribute by的功能,還兼具sort by的排序功能。

(3)GROUP BY語句通常會和聚合函數一起使用,按照一個或者多個列隊結果進行分組,然後對每個組執行聚合操作。

(4)子查詢

子查詢和标準SQL中的子查詢文法和用法基本一緻,需要注意的是,Hive中如果是從一個子查詢進行SELECT查詢,那麼子查詢必須設定一個别名。

SELECT col

FROM (

SELECT a+b AS col

FROM t1

) t2

where 語句中也支援子查詢。

SELECT *

FROM A

WHERE A.a IN (SELECT foo FROM B);

SELECT A

FROM T1

WHERE EXISTS (SELECT B FROM T2 WHERE T1.X = T2.Y)

WITH..AS..也叫做子查詢部分,語句允許hive定義一個sql片段,供整個sql使用,即将子查詢作為一個表的文法,叫做Common Table Expression(CTE)

with q1 as (select * from src where key= '5'),

q2 as (select * from src s2 where key = '4')

select from q1 union all select from q2;

with q1 as ( select key, value from src where key = '5')

from q1

insert overwrite table s1

select * from q1;

(5)Hive查詢中有兩個虛拟列:INPUT__FILE__NAME:資料對應的HDFS檔案名;

Hive常見語句及函數

BLOCK__OFFSET__INSIDE__FILE:該行記錄在檔案中的偏移量;

(6)HAVING 語句

having與where不同點

·where後面不能寫分組函數,而having後面可以使用分組函數。

·having隻用于group by分組統計語句。

(7) JOIN語句

Hive中除了支援和傳統資料庫中一樣的内關聯、左關聯、右關聯、全關聯,還支援LEFT SEMI JOIN和CROSS JOIN,但這兩種JOIN類型也可以用前面的代替。

·内關聯(JOIN)

·左外關聯(LEFT [OUTER] JOIN)

·右外關聯(RIHGHT [OUTER] JOIN)

(8)LIKE語句

如果字元串A或者字元串B為NULL,則傳回NULL;如果字元串A符合表達式B的正則文法,則為TRUE;否則為FALSE。B中字元”_”表示任意單個字元,而字元”%”表示任意數量的字元。

年齡表

Hive常見語句及函數

查詢年齡為1開頭的資料:select * from ages where age like '1%';

Hive常見語句及函數

查詢年齡第二位是1的資料:select * from ages where age like '_1%';

Hive常見語句及函數

RLIKE子句是Hive中LIKE功能的一個擴充,其可以通過Java的正規表達式這個更強大的語言來指定比對條件。

2.3.2 常用函數簡介

(1) 字元串連接配接函數,concat

文法: concat(string A, string B...)

傳回值: string

說明:傳回輸入字元串連接配接後的結果,支援任意個輸入字元串

舉例:select concat('abc','def','gh') from ages ;

Hive常見語句及函數

(2)帶分隔符字元串連接配接函數:concat_ws

文法: concat_ws(string SEP, string A, string B...)

傳回值: string

說明:傳回輸入字元串,連接配接後的結果,SEP表示各個字元串間的分隔符

舉例:select concat_ws(',','abc','def','gh') from ages ;

Hive常見語句及函數

除此之外還可以将數組的形式轉換為字元串concat_ws(string SEP, array)

舉例:select concat_ws('|',array('ads','des','ss')) from ages ;

Hive常見語句及函數

(3)集合去重函數:collect_set

文法: collect_set(col)

傳回值: array

說明: 将col字段進行去重,合并成一個數組。

舉例:cookies表

Hive常見語句及函數

select cookieid,collect_set(name) from cookies group by cookieid ;

Hive常見語句及函數

(4) UDTF一進多出

列轉行:explode

文法: explode(ARRAY)

傳回值: 多行

說明:将數組轉換為多行

舉例:select explode(array('ads','des','ss'))from ages;

Hive常見語句及函數

除此之外還可以将map拆分為多行。

(5)UDAF多進一出

聚合函數count,sum,avg等

(6)視窗函數

一般和聚合函數配合使用

OVER():指定分析函數工作的資料視窗大小,這個資料視窗大小可能會随着行的變而變化。

舉例:

orders表

Hive常見語句及函數
Hive常見語句及函數

總結:over是對分的組得到結果的count ,因為搜到了4個人,是以count數為4。直接count是分組後對組中的資料進行count。

Hive常見語句及函數
Hive常見語句及函數
Hive常見語句及函數

總結:添加partition by name 表示按照name分組進行sum求和。

(7) 排序函數

RANK() 排序相同時會重複,總數不會變

DENSE_RANK() 排序相同時會重複,總數會減少

ROW_NUMBER() 會根據順序計算

舉例:scores表

Hive常見語句及函數

select name,

subject,

score,

rank() over(partition by subject order by score desc) rp,

dense_rank() over(partition by subject order by score desc) drp,

row_number() over(partition by subject order by score desc) rmp

from scores;

得到結果:

Hive常見語句及函數

(8)函數總結大全

一、關系運算:

  1. 等值比較: =
  2. 等值比較:<=>
  3. 不等值比較: <>和!=
  4. 小于比較: <
  5. 小于等于比較: <=
  6. 大于比較: >
  7. 大于等于比較: >=
  8. 區間比較
  9. 空值判斷: IS NULL
  10. 非空判斷: IS NOT NULL
  11. LIKE比較: LIKE
  12. JAVA的LIKE操作: RLIKE
  13. REGEXP操作: REGEXP

    二、數學運算:

  14. 加法操作: +
  15. 減法操作: –
  16. 乘法操作: *
  17. 除法操作: /
  18. 取餘操作: %
  19. 位與操作: &
  20. 位或操作: |
  21. 位異或操作: ^

    9.位取反操作: ~

三、邏輯運算:

  1. 邏輯與操作: AND 、&&
  2. 邏輯或操作: OR 、||
  3. 邏輯非操作: NOT、!

    四、複合類型構造函數

  4. map結構
  5. struct結構
  6. named_struct結構
  7. array結構
  8. create_union

    五、複合類型操作符

  9. 擷取array中的元素
  10. 擷取map中的元素
  11. 擷取struct中的元素

    六、數值計算函數

  12. 取整函數: round
  13. 指定精度取整函數: round
  14. 向下取整函數: floor
  15. 向上取整函數: ceil
  16. 向上取整函數: ceiling
  17. 取随機數函數: rand
  18. 自然指數函數: exp
  19. 以10為底對數函數: log10
  20. 以2為底對數函數: log2
  21. 對數函數: log
  22. 幂運算函數: pow
  23. 幂運算函數: power
  24. 開平方函數: sqrt
  25. 二進制函數: bin
  26. 十六進制函數: hex
  27. 反轉十六進制函數: unhex
  28. 進制轉換函數: conv
  29. 絕對值函數: abs
  30. 正取餘函數: pmod
  31. 正弦函數: sin
  32. 反正弦函數: asin
  33. 餘弦函數: cos
  34. 反餘弦函數: acos
  35. positive函數: positive
  36. negative函數: negative

    七、集合操作函數

  37. map類型大小:size
  38. array類型大小:size
  39. 判斷元素數組是否包含元素:array_contains
  40. 擷取map中所有value集合
  41. 擷取map中所有key集合
  42. 數組排序

    八、類型轉換函數

  43. 二進制轉換:binary
  44. 基礎類型之間強制轉換:cast

    九、日期函數

  45. UNIX時間戳轉日期函數: from_unixtime
  46. 擷取目前UNIX時間戳函數: unix_timestamp
  47. 日期轉UNIX時間戳函數: unix_timestamp
  48. 指定格式日期轉UNIX時間戳函數: unix_timestamp
  49. 日期時間轉日期函數: to_date
  50. 日期轉年函數: year
  51. 日期轉月函數: month
  52. 日期轉天函數: day
  53. 日期轉小時函數: hour
  54. 日期轉分鐘函數: minute
  55. 日期轉秒函數: second
  56. 日期轉周函數: weekofyear
  57. 日期比較函數: datediff
  58. 日期增加函數: date_add
  59. 日期減少函數: date_sub

    十、條件函數

  60. If函數: if
  61. 非空查找函數: COALESCE
  62. 條件判斷函數:CASE
  63. 十一、字元串函數
  64. 字元ascii碼函數:ascii
  65. base64字元串
  66. 字元串連接配接函數:concat
  67. 帶分隔符字元串連接配接函數:concat_ws
  68. 數組轉換成字元串的函數:concat_ws
  69. 小數位格式化成字元串函數:format_number
  70. 字元串截取函數:substr,substring
  71. 字元串查找函數:instr
  72. 字元串長度函數:length
  73. 字元串查找函數:locate
  74. 字元串格式化函數:printf
  75. 字元串轉換成map函數:str_to_map
  76. base64解碼函數:unbase64(string str)
  77. 字元串轉大寫函數:upper,ucase
  78. 字元串轉小寫函數:lower,lcase
  79. 去空格函數:trim
  80. 左邊去空格函數:ltrim
  81. 右邊去空格函數:rtrim
  82. 正規表達式替換函數:regexp_replace
  83. 正規表達式解析函數:regexp_extract
  84. URL解析函數:parse_url
  85. json解析函數:get_json_object
  86. 空格字元串函數:space
  87. 重複字元串函數:repeat
  88. 左補足函數:lpad
  89. 右補足函數:rpad
  90. 分割字元串函數: split
  91. 集合查找函數: find_in_set
  92. 分詞函數:sentences
  93. 分詞後統計一起出現頻次最高的TOP-K
  94. 分詞後統計與指定單詞一起出現頻次最高的TOP-K

    十二、混合函數

  95. 調用Java函數:java_method
  96. 調用Java函數:reflect
  97. 字元串的hash值:hash

    十三、XPath解析XML函數

  98. xpath
  99. xpath_string
  100. xpath_boolean
  101. xpath_short, xpath_int, xpath_long
  102. xpath_float, xpath_double, xpath_number

    十四、彙總統計函數(UDAF)

  103. 個數統計函數: count
  104. 總和統計函數: sum
  105. 平均值統計函數: avg
  106. 最小值統計函數: min
  107. 最大值統計函數: max
  108. 非空集合總體變量函數: var_pop
  109. 非空集合樣本變量函數: var_samp
  110. 總體标準偏離函數: stddev_pop
  111. 樣本标準偏離函數: stddev_samp

    10.中位數函數: percentile

  112. 中位數函數: percentile
  113. 近似中位數函數: percentile_approx
  114. 直方圖: histogram_numeric
  115. 集合去重數:collect_set
  116. 集合不去重函數:collect_list

    十五、表格生成函數Table-Generating Functions (UDTF)

  117. 數組拆分成多行:explode
  118. Map拆分成多行:explode