主頁 >  其他 > Hive(總)看完這篇,別說你不會Hive!

Hive(總)看完這篇,別說你不會Hive!

2020-09-25 10:09:43 其他

文章目錄

  • 1.Hive入門
    • 1.1什么是Hive
    • 1.2 Hive的優缺點
      • 1.2.1 優點
      • 1.2.2 缺點
    • 1.3Hive架構原理
  • 2.Hive安裝
    • 2.1Hive安裝
    • 2.2HiveJDBC訪問
      • 2.2.1啟動hiveserver2服務
      • 2.2.2連接hiveserver2服務
      • 2.2.3注意
    • 2.3Hive常用互動命令
    • 2.4Hive其他命令操作
    • 2.5Hive常見屬性配置
      • 2.5.1資料倉庫位置配置
      • 2.5.2查詢后資訊顯示配置
      • 2.5.3運行日志資訊配置
  • 3.Hive資料型別
    • 3.1基本資料型別
    • 3.2集合資料型別
    • 3.3型別轉化
  • 4.DDL資料定義
    • 4.1創建資料庫
    • 4.2查詢資料庫
    • 4.3洗掉資料庫
    • 4.4創建表
      • 4.4.1內部表
      • 4.4.2外部表
        • 案例詳解
      • 4.4.3管理表與外部表的互相轉換
    • 4.5磁區表(partition)
      • 4.5.1磁區表基本操作
    • 4.6修改表
      • 4.6.1重命名表
      • 4.6.2增加/修改/替換列資訊
      • 4.6.3洗掉表
  • 5.DML資料操作
    • 5.1 資料匯入
      • 5.1.1 向表中裝載資料(Load)
      • 5.1.2 通過查詢陳述句向表中插入資料(Insert)
      • 5.1.3 查詢陳述句中創建表并加載資料(As Select)
      • 5.1.4 創建表時通過Location指定加載資料路徑
      • 5.1.5 Import資料到指定Hive表中
    • 5.2 資料匯出
      • 5.2.1 Insert匯出
      • 5.2.2 Hadoop命令匯出到本地
      • 5.2.3 Hive Shell 命令匯出
      • 5.2.4 Export匯出到HDFS上
      • 5.2.5 Sqoop匯出
    • 5.3 清除表中資料(Truncate)
  • 6.查詢
    • 6.1 基本查詢(Select…From)
      • 6.1.1 全表和特定列查詢
      • 6.1.2 列別名
      • 6.1.3 算術運算子
      • 6.1.4 常用函式
      • 6.1.5 Limit陳述句
    • 6.2 Where陳述句
      • 6.2.1 比較運算子(Between/In/ Is Null)
      • 6.2.2 Like和RLike
      • 6.2.3 邏輯運算子(And/Or/Not)
    • 6.3 分組
      • 6.3.1 Group By陳述句
      • 6.3.2 Having陳述句
    • 6.4 Join陳述句
      • 6.4.1 等值Join
      • 6.4.2 表的別名
      • 6.4.3 內連接
      • 6.4.4 左外連接
      • 6.4.5右外連接
      • 6.4.6 滿外連接
      • 6.4.7 笛卡爾積
      • 6.4.8 連接謂詞中不支持or
    • 6.5 排序
      • 6.5.1 全域排序(Order By)
      • 6.5.2 每個MapReduce內部排序(Sort By)
      • 6.5.3 磁區排序(Distribute By)
      • 6.5.4 Cluster By
    • 6.6 分桶(buckets)及抽樣查詢
      • 6.6.1 分桶表資料存盤
      • 6.6.2 分桶抽樣查詢
    • 6.7 其他常用查詢函式
      • 6.7.1 空欄位賦值
      • 6.7.2 CASE WHEN
      • 6.7.3 行轉列
      • 6.7.4 列轉行
      • 6.7.5 視窗函式
      • 6.7.6 Rank
  • 7.函式
    • 7.1Hive函式分類
    • 7.2內置函式
      • 7.2.1字符函式
      • 7.2.2 型別轉換函式和數學函式
      • 7.2.3 日期函式
      • 7.2.4 集合函式
      • 7.2.5 條件函式
      • 7.2.6 聚合函式和表生成函式
    • 7.3 自定義UDF函式
  • 8.性能優化
    • 8.1 Hive事務
    • 8.2 Hive PLSQL
    • 8.3 Hive性能調優工具
    • 8.4 Hive優化設計
    • 8.5 Job優化
    • 8.6 查詢優化
    • 8.7 壓縮演算法
    • 8.5 Job優化
    • 8.6 查詢優化
    • 8.7 壓縮演算法

1.Hive入門

1.1什么是Hive

Hive:由Facebook開源用于解決海量結構化日志的資料統計,

Hive是基于Hadoop的一個資料倉庫工具,可以將結構化的資料檔案映射為一張表,并提供類SQL查詢功能,

本質是:將HQL轉化成MapReduce程式

image-20200916135459253

1)Hive處理的資料存盤在HDFS

2)Hive分析資料底層的實作是MapReduce

3)執行程式運行在Yarn上

1.2 Hive的優缺點

1.2.1 優點

  1. 操作介面采用類SQL語法,提供快速開發的能力(簡單、容易上手),

  2. 避免了去寫MapReduce,減少開發人員的學習成本,

  3. Hive的執行延遲比較高,因此Hive常用于資料分析,對實時性要求不高的場合,

4)Hive優勢在于處理大資料,對于處理小資料沒有優勢,因為Hive的執行延遲比較高,

  1. Hive支持用戶自定義函式,用戶可以根據自己的需求來實作自己的函式,

1.2.2 缺點

1.Hive的HQL表達能力有限

(1)迭代式演算法無法表達

(2)資料挖掘方面不擅長

2.Hive的效率比較低

(1)Hive自動生成的MapReduce作業,通常情況下不夠智能化

(2)Hive調優比較困難,粒度較粗

1.3Hive架構原理

img

1.用戶介面:Client

CLI(hive shell)、JDBC/ODBC(java訪問hive)、WEBUI(瀏覽器訪問hive)

2.元資料:Metastore

元資料包括:表名、表所屬的數據庫(默認是default)、表的擁有者、列/磁區欄位、表的型別(是否是外部表)、表的資料所在目錄等;

默認存盤在自帶的derby資料庫中,推薦使用MySQL存盤Metastore

3.Hadoop

使用HDFS進行存盤,使用MapReduce進行計算,

4.驅動器:Driver

(1)決議器(SQL Parser):將SQL字串轉換成抽象語法樹AST,這一步一般都用第三方工具庫完成,比如antlr;對AST進行語法分析,比如表是否存在、欄位是否存在、SQL語意是否有誤,

(2)編譯器(Physical Plan):將AST編譯生成邏輯執行計劃,

(3)優化器(Query Optimizer):對邏輯執行計劃進行優化,

(4)執行器(Execution):把邏輯執行計劃轉換成可以運行的物理計劃,對于Hive來說,就是MR/Spark,

image-20200916140721644

Hive通過給用戶提供的一系列互動介面,接收到用戶的指令(SQL),使用自己的Driver,結合元資料(MetaStore),將這些指令翻譯成MapReduce,提交到Hadoop中執行,最后,將執行回傳的結果輸出到用戶互動介面,

2.Hive安裝

2.1Hive安裝

《Hive安裝教程》

2.2HiveJDBC訪問

2.2.1啟動hiveserver2服務

hiveserver2

image-20200916143756819

2.2.2連接hiveserver2服務

新建命令視窗,輸入以下命令

beeline -u "jdbc:hive2://localhost:10000"

出現該圖代表成功連接

image-20200916144644772

2.2.3注意

這里報錯通常是由于權限不夠,只需要對tmp和opt檔案夾賦權即可

hadoop fs -chmod -R 777 /tmp
hadoop fs -chmod -R 777 /opt

2.3Hive常用互動命令

1.“-e”不進入hive的互動視窗執行sql陳述句

hive -e "查詢陳述句"

2.“-f”執行腳本中sql陳述句

hive -f sql檔案路徑/sql檔案名稱

執行檔案中的sql陳述句并將結果寫入檔案中

hive -f sql檔案路徑/sql檔案名稱  > 保存結果的路徑

2.4Hive其他命令操作

1.退出hive視窗

exit;
quit;

2.在hive cli命令視窗中如何查看hdfs檔案系統

dfs -ls /;

image-20200916150426537

3.在hive cli命令視窗中如何查看本地檔案系統

!ls /opt;

image-20200916151233406

2.5Hive常見屬性配置

2.5.1資料倉庫位置配置

修改hive-site.xml檔案的value

<property>
<name>hive.metastore.warehouse.dir</name>
<value>/opt/hive/warehouse</value>
</property>

2.5.2查詢后資訊顯示配置

hive-site.xml檔案中添加如下配置資訊,就可以實作顯示當前資料庫,以及查詢表的頭資訊配置,

<property>
	<name>hive.cli.print.header</name>
	<value>true</value>
</property>

<property>
	<name>hive.cli.print.current.db</name>
	<value>true</value>
</property>

重新啟動hive,對比配置前后差異,

image-20200916153135946

image-20200916154010571

2.5.3運行日志資訊配置

  • Hive的log默認存放在/tmp/root/hive.log目錄下(root為當前用戶名)

image-20200916155105713

  • 修改hive的log存放日志到/opt/hive/logs

1.修改/opt/hive/conf/hive-log4j.properties.template檔案名稱為hive-log4j.properties

mv hive-log4j.properties.template hive-log4j.properties

2.在hive-log4j.properties檔案中修改log存放位置

hive.log.dir=/opt/hive/logs

image-20200916155615882

重啟hive

image-20200916160113010

3.Hive資料型別

3.1基本資料型別

Hive資料型別Java資料型別長度例子
TINYINTbyte1byte有符號整數20
SMALINTshort2byte有符號整數20
INTint4byte有符號整數20
BIGINTlong8byte有符號整數20
BOOLEANboolean布爾型別,true或者falseTRUE FALSE
FLOATfloat單精度浮點數3.14159
DOUBLEdouble雙精度浮點數3.14159
STRINGstring字符系列,可以指定字符集,可以使用單引號或者雙引號,‘now is the time’ “for all good men”
TIMESTAMP時間型別'2013-01-31 00:13:00.345’
BINARY位元組陣列(二進制)1010

紅標為常用的資料型別;

對于Hive的String型別相當于資料庫的varchar型別,該型別是一個可變的字串,不過它不能宣告其中最多能存盤多少個字符,

3.2集合資料型別

資料型別描述語法示例
STRUCT相當于java語言當中沒有方法的物件,只有屬性,例如,如果某個列的資料型別是STRUCT{first STRING, last STRING},那么第1個元素可以通過欄位.first來參考,struct()
MAPMAP是一組鍵-值對元組集合,使用陣串列示法可以訪問資料,例如,如果某個列的資料型別是MAP,其中鍵->值對是’first’->’John’和’last’->’Doe’,那么可以通過欄位名[‘last’]獲取最后一個元素map()
ARRAY陣列是一組具有相同型別和名稱的變數的集合,這些變數稱為陣列的元素,每個陣列元素都有一個編號,編號從零開始,例如,陣列值為[‘John’, ‘Doe’],那么第2個元素可以通過陣列名[1]進行參考,Array()

3.3型別轉化

可以使用CAST操作顯示進行資料型別轉換

例如CAST(‘1’ AS INT)將把字串’1’ 轉換成整數1;如果強制型別轉換失敗,如執行CAST(‘X’ AS INT),運算式回傳空值 NULL,

4.DDL資料定義

4.1創建資料庫

  • 創建一個資料庫,資料庫在HDFS上的默認存盤路徑是/opt/hive/warehouse/*.db
create database hivetest;
  • 避免要創建的資料庫已經存在錯誤,增加if not exists判斷,(標準寫法)
create database if not exists hivetest;

image-20200916163107048

  • 創建一個資料庫,指定資料庫在HDFS上存放的位置
create database if not exists hivetest location 'hdfs路徑';

image-20200916163354544

4.2查詢資料庫

  • 顯示資料庫
show databases;

image-20200916165802686

? 過濾顯示查詢的資料庫

show databases like 'hivetest*';

image-20200916165936990

  • 查看資料庫詳情
desc database hivetest;

image-20200916170340247

  • 切換當前資料庫
use 目標資料庫名稱;

4.3洗掉資料庫

  • 洗掉空資料庫
drop database 庫名;
  • 如果洗掉的資料庫不存在,最好采用 if exists判斷資料庫是否存在
drop database if exists 庫名;
  • 如果資料庫不為空,可以采用cascade命令,強制洗掉
drop database 庫名 cascade;

4.4創建表

  • 建表語法
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] 
[LOCATION hdfs_path]
  • 欄位解釋說明

(1)CREATE TABLE 創建一個指定名字的表,如果相同名字的表已經存在,則拋出例外;用戶可以用 IF NOT EXISTS 選項來忽略這個例外,

(2)EXTERNAL關鍵字可以讓用戶創建一個外部表,在建表的同時指定一個指向實際資料的路徑(LOCATION),Hive創建內部表時,會將資料移動到資料倉庫指向的路徑;若創建外部表,僅記錄資料所在的路徑,不對資料的位置做任何改變,在洗掉表的時候,內部表的元資料和資料會被一起洗掉,而外部表只洗掉元資料,不洗掉資料,

(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的簡稱,目的是用于序列化和反序列化,

(8)STORED AS指定存盤檔案型別

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

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

(9)LOCATION :指定表在HDFS上的存盤位置,

(10)LIKE允許用戶復制現有的表結構,但是不復制資料,

4.4.1內部表

默認創建的表都是所謂的管理表,有時也被稱為內部表,因為這種表,Hive會(或多或少地)控制著資料的生命周期,Hive默認情況下會將這些表的資料存盤在由配置項hive.metastore.warehouse.dir(例如,/opt/hive/warehouse)所定義的目錄的子目錄下, 當我們洗掉一個管理表時,Hive也會洗掉這個表中資料,管理表不適合和其他工具共享資料,

  • 普通創建表
create table if not exists student2(
id int, name string
)
row format delimited fields terminated by '\t';
  • 根據查詢結果創建表(查詢的結果會添加到新創建的表中)
create table if not exists student3 as select id, name from student;
  • 根據已經存在的表結構創建表
create table if not exists student4 like student;
  • 查詢表的型別
desc formatted student2;

4.4.2外部表

因為表是外部表,所以Hive并非認為其完全擁有這份資料,洗掉該表并不會洗掉掉這份資料,不過描述表的元資料資訊會被洗掉掉,

  • 管理表和外部表的使用場景

每天將收集到的網站日志定期流入HDFS文本檔案,在外部表(原始日志表)的基礎上做大量的統計分析,用到的中間表、結果表使用內部表存盤,資料通過SELECT+INSERT進入內部表,

案例詳解

分別創建employee外部表,并向表中匯入資料,

Michael|Montreal,Toronto|Male,30|DB:80|Product:DeveloperLead
Will|Montreal|Male,35|Perl:85|Product:Lead,Test:Lead
Shelley|New York|Female,27|Python:80|Test:Lead,COE:Architect
Lucy|Vancouver|Female,57|Sales:89|Sales:Lead
  • 建表陳述句

創建員工表

create external table if not exists employee(
name string,
address array<string>,
personalInfo array<string>,
technol map<string,int>,
jobs map<string,string>)
row format delimited
fields terminated by '|'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n';

向外部表中匯入資料

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

查詢結果

select * from employee;

image-20200916201159535

4.4.3管理表與外部表的互相轉換

  • 修改內部表student2為外部表
alter table student2 set tblproperties('EXTERNAL'='TRUE');
  • 修改外部表student2為內部表
alter table student2 set tblproperties('EXTERNAL'='FALSE');

注意:('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')為固定寫法,區分大小寫!

4.5磁區表(partition)

磁區表實際上就是對應一個HDFS檔案系統上的獨立的檔案夾,該檔案夾下是該磁區所有的資料檔案,Hive中的磁區就是分目錄,把一個大的資料集根據業務需要分割成小的資料集,在查詢時通過WHERE子句中的運算式選擇查詢所需要的指定的磁區,這樣的查詢效率會提高很多,

4.5.1磁區表基本操作

資料

10,ACCOUNTING,NEW YORK
10,ACCOUNTING,NEW YORK
10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
20,RESEARCH,DALLAS
20,RESEARCH,DALLAS
30,SALES,CHICAGO
30,SALES,CHICAGO

1.引入磁區表(需要根據日期對日志進行管理)

/opt/hive/warehouse/log_partition/20170702/20170702.log
/opt/hive/warehouse/log_partition/20170703/20170703.log
/opt/hive/warehouse/log_partition/20170704/20170704.log

2.創建磁區表語法

create table dept_partition(
deptno int, dname string, loc string
)
partitioned by (month string)
row format delimited fields terminated by ',';

3.加載資料到磁區表中

load data local inpath '/opt/dept.txt' into table default.dept_partition partition(month='201707’);
load data local inpath '/opt/dept.txt' into table default.dept_partition partition(month='201708);
load data local inpath '/opt/dept.txt' into table default.dept_partition partition(month='201709);

image-20200916231329604

image-20200916230900306

image-20200916230917167

4.查詢磁區表中資料

單磁區查詢

select * from dept_partition where month='201709';

image-20200916231504421

多磁區聯合查詢

select * from dept_partition where month='201709'
union
select * from dept_partition where month='201708'
union
select * from dept_partition where month='201707';

注意

Hive 1.2.0之前的版本僅支持UNION ALL,其中重復的行不會被洗掉,

Hive 1.2.0和更高版本中,UNION的默認行為是從結果中洗掉重復的行,

5.增加磁區

alter table dept_partition add partition(month='201706') ;
alter table dept_partition add partition(month='201705') ,partition(month='201704');

6.洗掉磁區

alter table dept_partition drop partition (month='201704');
alter table dept_partition drop partition (month='201705'), partition (month='201706')

7.查看磁區表有多少磁區

show partitions dept_partition;

8.查看磁區表結構

desc formatted dept_partition;

4.6修改表

4.6.1重命名表

  • 語法
ALTER TABLE table_name RENAME TO new_table_name
  • 實體
alter table dept_partition2 rename to dept_partition3;

4.6.2增加/修改/替換列資訊

  • 語法

更新列

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]

增加和替換列

ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) 

注:ADD是代表新增一欄位,欄位位置在所有列后面(partition列前),REPLACE則是表示替換表中所有欄位,

  • 案例

添加列

alter table dept_partition add columns(deptdesc string);

更新列

alter table dept_partition change column deptdesc desc int;

替換列

alter table dept_partition replace columns(deptno string, dname string, loc string);

image-20200917192015967

image-20200917192028686

4.6.3洗掉表

drop table dept_partition;

注意:外部表不能簡單的通過這個命令洗掉,這個命令只能洗掉外部表的元資料,沒有辦法洗掉hdfs上面的資料,如果需要將外部表徹底洗掉,有以下方法:

  • 方案一:轉換為內部表再洗掉
ALTER TABLE xxx SET TBLPROPERTIES('EXTERNAL'='False');

drop table xxx;
  • 方案二:洗掉元資料,然后使用hdfs洗掉資料

5.DML資料操作

5.1 資料匯入

5.1.1 向表中裝載資料(Load)

  • 語法
hive> load data [local] inpath '路徑' [overwrite] into table 表名 [partition (partcol1=val1,)];

(1)load data:表示加載資料

(2)local:表示從本地加載資料到hive表;否則從HDFS加載資料到hive表

(3)inpath:表示加載資料的路徑

(4)overwrite:表示覆寫表中已有資料,否則表示追加

(5)into table:表示加載到哪張表

(6)表名:表示具體的表

(7)partition:表示上傳到指定磁區

5.1.2 通過查詢陳述句向表中插入資料(Insert)

  • 案例

基本插入

insert into table  student partition(month='201709') values(1,'wangwu');
insert overwrite table student partition(month='201708') select id, name from student where month='201709';

多插入

from dept_partition
              insert overwrite table dept_partition partition(month='201707')
              select deptno,dname,loc where month='201709'
              insert overwrite table dept_partition partition(month='201706')
              select deptno,dname,loc  where month='201709';

5.1.3 查詢陳述句中創建表并加載資料(As Select)

根據查詢結果創建表(查詢的結果會添加到新創建的表中)

create table if not exists student3 as select id, name from student;

5.1.4 創建表時通過Location指定加載資料路徑

創建表,并指定在hdfs上的位置

create table if not exists student5(
id int, name string)
row format delimited fields terminated by '\t'
location '/user/hive/warehouse/student5';

上傳資料到hdfs上

dfs -put /opt/datas/student.txt /opt/hive/warehouse/student5;

5.1.5 Import資料到指定Hive表中

注意:先用export匯出后,再將資料匯入,

import table student2 partition(month='201709') from '/opt/hive/warehouse/export/student';

5.2 資料匯出

5.2.1 Insert匯出

1.將查詢的結果匯出到本地

insert overwrite local directory '/opt/datas' select * from dept_partition;

image-20200918084842193

image-20200918085621207

2.將查詢的結果格式化匯出到本地

insert overwrite local directory '/opt/datas/dept1'
row format delimited
fields terminated by '|'
select * from dept_partition;

image-20200918085644479

3.將查詢的結果匯出到HDFS上(沒有local)

insert overwrite directory '/opt/datas/dept'
row format delimited
fields terminated by '|'
select * from dept_partition;

image-20200918090048512

5.2.2 Hadoop命令匯出到本地

dfs -get /opt/hive/warehouse/employee/employee.txt /opt/datas/dept2/dept.txt;

5.2.3 Hive Shell 命令匯出

基本語法:(hive -f/-e 執行陳述句或者腳本 > file)

hive -e 'select * from hivetest.dept_partition;' > /opt/datas/dept3/dept.txt;

注意:需要在shell視窗執行,需要庫名.表名,需要本地檔案夾存在,

image-20200918091555443

5.2.4 Export匯出到HDFS上

export table hivetest.dept_partition to '/opt/datas/dept2';

5.2.5 Sqoop匯出

后續

5.3 清除表中資料(Truncate)

注意:Truncate只能洗掉管理表,不能洗掉外部表中資料

truncate table student;

6.查詢

查詢陳述句語法:

[WITH CommonTableExpression (, CommonTableExpression)*]    (Note: Only available
 starting with Hive 0.13.0)
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
  FROM table_reference
  [WHERE where_condition]
  [GROUP BY col_list]
  [ORDER BY col_list]
  [CLUSTER BY col_list
    | [DISTRIBUTE BY col_list] [SORT BY col_list]
  ]
 [LIMIT number]

6.1 基本查詢(Select…From)

6.1.1 全表和特定列查詢

select * from emp;
select empno, ename from emp;

注意:

(1)SQL 語言大小寫不敏感,

(2)SQL 可以寫在一行或者多行

(3)關鍵字不能被縮寫也不能分行

(4)各子句一般要分行寫,

(5)使用縮進提高陳述句的可讀性,

6.1.2 列別名

1.重命名一個列

2.便于計算

3.緊跟列名,可以在列名和別名之間加入關鍵字‘AS’

select ename AS name, deptno dn from emp;

6.1.3 算術運算子

運算子描述
A+BA和B 相加
A-BA減去B
A*BA和B 相乘
A/BA除以B
A%BA對B取余
A&BA和B按位取與
A|BA和B按位取或
A^BA和B按位取異或
~AA按位取反

6.1.4 常用函式

1.求總數(count)

2.求最大值(max)

3.求最小值(min)

4.求總和(sum)

5.求平均值(avg)

select count(*) cnt from emp;

6.1.5 Limit陳述句

典型的查詢會回傳多行資料,LIMIT子句用于限制回傳的行數,

select * from emp limit 5;

6.2 Where陳述句

1.使用WHERE子句,將不滿足條件的行過濾掉

2.WHERE子句緊隨FROM子句

案例:查詢出薪水大于1000的所有員工

select * from emp where sal >1000;

6.2.1 比較運算子(Between/In/ Is Null)

下面表中描述了謂詞運算子,這些運算子同樣可以用于JOIN…ON和HAVING陳述句中,

運算子支持的資料型別描述
A=B基本資料型別如果A等于B則回傳TRUE,反之回傳FALSE
A<=>B基本資料型別如果A和B都為NULL,則回傳TRUE,其他的和等號(=)運算子的結果一致,如果任一為NULL則結果為NULL
A<>B, A!=B基本資料型別A或者B為NULL則回傳NULL;如果A不等于B,則回傳TRUE,反之回傳FALSE
A<B基本資料型別A或者B為NULL,則回傳NULL;如果A小于B,則回傳TRUE,反之回傳FALSE
A<=B基本資料型別A或者B為NULL,則回傳NULL;如果A小于等于B,則回傳TRUE,反之回傳FALSE
A>B基本資料型別A或者B為NULL,則回傳NULL;如果A大于B,則回傳TRUE,反之回傳FALSE
A>=B基本資料型別A或者B為NULL,則回傳NULL;如果A大于等于B,則回傳TRUE,反之回傳FALSE
A [NOT] BETWEEN B AND C基本資料型別如果A,B或者C任一為NULL,則結果為NULL,如果A的值大于等于B而且小于或等于C,則結果為TRUE,反之為FALSE,如果使用NOT關鍵字則可達到相反的效果,
A IS NULL所有資料型別如果A等于NULL,則回傳TRUE,反之回傳FALSE
A IS NOT NULL所有資料型別如果A不等于NULL,則回傳TRUE,反之回傳FALSE
IN(數值1, 數值2)所有資料型別使用 IN運算顯示串列中的值
A [NOT] LIKE BSTRING 型別B是一個SQL下的簡單正則運算式,如果A與其匹配的話,則回傳TRUE;反之回傳FALSE,B的運算式說明如下:‘x%’表示A必須以字母‘x’開頭,‘%x’表示A必須以字母’x’結尾,而‘%x%’表示A包含有字母’x’,可以位于開頭,結尾或者字串中間,如果使用NOT關鍵字則可達到相反的效果,
A RLIKE B, A REGEXP BSTRING 型別B是一個正則運算式,如果A與其匹配,則回傳TRUE;反之回傳FALSE,匹配使用的是JDK中的正則運算式介面實作的,因為正則也依據其中的規則,例如,正則運算式必須和整個字串A相匹配,而不是只需與其字串匹配,

6.2.2 Like和RLike

1)使用LIKE運算選擇類似的值

2)選擇條件可以包含字符或數字:

% 代表零個或多個字符(任意個字符),

_ 代表一個字符,

3)RLIKE子句是Hive中這個功能的一個擴展,其可以通過Java的正則運算式這個更強大的語言來指定匹配條件,

案例:

查找以2開頭薪水的員工資訊

select * from emp where sal LIKE '2%';

查找第二個數值為2的薪水的員工資訊

select * from emp where sal LIKE '_2%';

查找薪水中含有2的員工資訊

select * from emp where sal RLIKE '[2]';

6.2.3 邏輯運算子(And/Or/Not)

運算子含義
AND邏輯并
OR邏輯或
NOT邏輯否

案例:查詢薪水大于1000,部門是30

select * from emp where sal>1000 and deptno=30;

6.3 分組

6.3.1 Group By陳述句

GROUP BY陳述句通常會和聚合函式一起使用,按照一個或者多個列隊結果進行分組,然后對每個組執行聚合操作,

案例:計算emp表每個部門的平均工資

select t.deptno, avg(t.sal) avg_sal from emp t group by t.deptno;

6.3.2 Having陳述句

1.having與where不同點

(1)where針對表中的列發揮作用,查詢資料;having針對查詢結果中的列發揮作用,篩選資料,

(2)where后面不能寫分組函式,而having后面可以使用分組函式,

(3)having只用于group by分組統計陳述句,

案例:求每個部門的平均薪水大于2000的部門

hive (default)> select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;

6.4 Join陳述句

6.4.1 等值Join

Hive支持通常的SQL JOIN陳述句,但是只支持等值連接,不支持非等值連接,

select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;

6.4.2 表的別名

1.好處

(1)使用別名可以簡化查詢,

(2)使用表名前綴可以提高執行效率,

select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;

6.4.3 內連接

內連接:只有進行連接的兩個表中都存在與連接條件相匹配的資料才會被保留下來,

select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;

6.4.4 左外連接

左外連接:JOIN運算子左邊表中符合WHERE子句的所有記錄將會被回傳,

select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno;

6.4.5右外連接

右外連接:JOIN運算子右邊表中符合WHERE子句的所有記錄將會被回傳,

select e.empno, e.ename, d.deptno from emp e right join dept d on e.deptno = d.deptno;

6.4.6 滿外連接

滿外連接:將會回傳所有表中符合WHERE陳述句條件的所有記錄,如果任一表的指定欄位沒有符合條件的值的話,那么就使用NULL值替代,

 select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno;

6.4.7 笛卡爾積

1.笛卡爾集會在下面條件下產生

(1)省略連接條件

(2)連接條件無效

(3)所有表中的所有行互相連接

6.4.8 連接謂詞中不支持or

select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno or e.ename=d.ename;   錯誤的

6.5 排序

6.5.1 全域排序(Order By)

Order By:全域排序,一個Reducer

1.使用 ORDER BY 子句排序

ASC(ascend): 升序(默認)

DESC(descend): 降序

2.ORDER BY 子句在SELECT陳述句的結尾

3.案例實操 :查詢員工資訊按工資升序排列

select * from emp order by sal;

6.5.2 每個MapReduce內部排序(Sort By)

Sort By:每個Reducer內部進行排序,對全域結果集來說不是排序,叢林

1.設定reduce個數

set mapreduce.job.reduces=3;

2.查看設定reduce個數

set mapreduce.job.reduces;

3.根據部門編號降序查看員工資訊

select *from dept_partition sort by deptno;

image-20200918105118225

對于全域結果來說并沒有排序,只是對每個reduce的結果進行了排序,

6.5.3 磁區排序(Distribute By)

Distribute By:類似MR中partition,進行磁區,結合sort by使用,

? 注意,Hive要求DISTRIBUTE BY陳述句要寫在SORT BY陳述句之前,

對于distribute by進行測驗,一定要分配多reduce進行處理,否則無法看到distribute by的效果,

select *from dept_partition distribute by deptno sort by month;

image-20200918110214395

insert overwrite  local directory '/opt/datas/dept3' select *from dept_partition distribute by deptno sort by month;

image-20200918110816515

6.5.4 Cluster By

當distribute by和sorts by欄位相同時,可以使用cluster by方式,

cluster by除了具有distribute by的功能外還兼具sort by的功能,但是排序只能是升序排序,不能指定排序規則為ASC或者DESC,

以下兩種方法等價:

select *from dept_partition distribute by deptno sort by deptno;
select *from dept_partition cluster by deptno;

注意:按照部門編號磁區,不一定就是固定死的數值,可以是20號和30號部門分到一個磁區里面去,

6.6 分桶(buckets)及抽樣查詢

6.6.1 分桶表資料存盤

磁區針對的是資料的存盤路徑;分桶針對的是資料檔案,
磁區提供一個隔離資料和優化查詢的便利方式,不過,并非所有的資料集都可形成合理的磁區,特別是之前所提到過的要確定合適的劃分大小這個疑慮,
分桶是將資料集分解成更容易管理的若干部分的另一個技術,

設定分捅屬性

set hive.enforce.bucketing=true;

創建分桶表

create table stu_buck(id int, name string)
clustered by(id) 
into 4 buckets
row format delimited fields terminated by '\t';

匯入資料到分桶表,通過子查詢的方式

insert into table stu_buck select id, name from stu;

img

分捅表只能通過insert插入資料,load讀取資料是無效的,

6.6.2 分桶抽樣查詢

對于非常大的資料集,有時用戶需要使用的是一個具有代表性的查詢結果而不是全部結果,Hive可以通過對表進行抽樣來滿足這個需求,

select * from customers_buck1 tablesample(bucket 1 out of 4 on customer_fname);

注:tablesample是抽樣陳述句,語法:TABLESAMPLE(BUCKET x OUT OF y) ,

y必須是table總bucket數的倍數或者因子,hive根據y的大小,決定抽樣的比例,例如,table總共分了4份,當y=2時,抽取(4/2=)2個bucket的資料,當y=8時,抽取(4/8=)1/2個bucket的資料,

==x表示從第幾個bucket開始抽取,如果需要取多個磁區,以后的磁區號為當前磁區號加上y,==例如,table總bucket數為4,tablesample(bucket 1 out of 2),表示總共抽取(4/2=)2個bucket的資料,抽取第1(x)個和第3(x+y)個bucket的資料,

注意:x的值必須小于等于y的值,否則

FAILED: SemanticException [Error 10061]: Numerator should not be bigger than denominator in sample clause for table stu_buck

image-20200918115835423

表總共有:

image-20200918115908536

分捅相當于預覽了部分資料,

6.7 其他常用查詢函式

6.7.1 空欄位賦值

1.函式說明
NVL:給值為NULL的資料賦值,它的格式是NVL( string1, replace_with),它的功能是如果string1為NULL,則NVL函式回傳replace_with的值,否則回傳string1的值,如果兩個引數都為NULL ,則回傳NULL,

c表資料:

image-20200918122523852

select c1,nvl(c2,1) from c;

image-20200918122556953

6.7.2 CASE WHEN

  1. 資料準備
namedept_idsex
悟空A
大海A
宋宋B
鳳姐A
婷姐B
婷婷B

2.需求

求出不同部門男女各多少人,結果如下:

A     2       1
B     1       2

3.按需求查詢資料

select dept_id,
sum(case when sex='男' then 1 else 0 end) man,
sum(case when sex='女' then 1 else 0 end) woman
from emp_sex group by dept_id;

image-20200922144204356

6.7.3 行轉列

1.相關函式說明

CONCAT(string A/col, string B/col…):回傳輸入字串連接后的結果,支持任意個輸入字串;

CONCAT_WS(separator, str1, str2,...):它是一個特殊形式的 CONCAT(),第一個引數剩余引數間的分隔符,分隔符可以是與剩余引數一樣的字串,如果分隔符是 NULL,回傳值也將為 NULL,這個函式會跳過分隔符引數后的任何 NULL 和空字串,分隔符將被加到被連接的字串之間;

COLLECT_SET(col):函式只接受基本資料型別,它的主要作用是將某欄位的值進行去重匯總,產生array型別欄位,

2.資料準備

nameconstellationblood_type
孫悟空白羊座A
大海射手座A
宋宋白羊座B
豬八戒白羊座A
鳳姐射手座A

3.需求

把星座和血型一樣的人歸類到一起,結果如下:

射手座,A            大海|鳳姐
白羊座,A            孫悟空|豬八戒
白羊座,B            宋宋

4.按需求查詢資料

select
    t1.base,
    concat_ws('|', collect_set(t1.name)) name
from
    (select
        name,
        concat(constellation, ",", blood_type) base
    from
        person_info) t1
group by
    t1.base;

6.7.4 列轉行

1.函式說明

EXPLODE(col):將hive一列中復雜的array或者map結構拆分成多行,

LATERAL VIEW

用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

解釋:用于和split, explode等UDTF一起使用,它能夠將一列資料拆成多行資料,在此基礎上可以對拆分后的資料進行聚合,

2.資料準備

moviecategory
《疑犯追蹤》懸疑,動作,科幻,劇情
《Lie to me》懸疑,警匪,動作,心理,劇情
《戰狼2》戰爭,動作,災難

3.需求

將電影分類中的陣列資料展開,結果如下:

《疑犯追蹤》      懸疑
《疑犯追蹤》      動作
《疑犯追蹤》      科幻
《疑犯追蹤》      劇情
《Lie to me》   懸疑
《Lie to me》   警匪
《Lie to me》   動作
《Lie to me》   心理
《Lie to me》   劇情
《戰狼2》        戰爭
《戰狼2》        動作
《戰狼2》        災難

4.按需求查詢資料

select  movie,category_name from movie_info
 lateral view explode(category) table_tmp  as category_name;

6.7.5 視窗函式

1.相關函式說明

OVER():指定分析函式作業的資料視窗大小,這個資料視窗大小可能會隨著行的變而變化

CURRENT ROW:當前行

n PRECEDING:往前n行資料

n FOLLOWING:往后n行資料

UNBOUNDED:起點,UNBOUNDED PRECEDING 表示從前面的起點, UNBOUNDED FOLLOWING表示到后面的終點

LAG(col,n):往前第n行資料

LEAD(col,n):往后第n行資料

NTILE(n):把有序磁區中的行分發到指定資料的組中,各個組有編號,編號從1開始,對于每一行,NTILE回傳此行所屬的組的編號,注意:n必須為int型別,

2.資料準備:name,orderdate,cost

jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94

3.需求

(1)查詢在2017年4月份購買過的顧客及總人數

(2)查詢顧客的購買明細及月購買總額

(3)上述的場景,要將cost按照日期進行累加

(4)查詢顧客上次的購買時間

(5)查詢前20%時間的訂單資訊

4.按需求查詢資料

(1)查詢在2017年4月份購買過的顧客及總人數

select name,count(*) over () from business where substring(orderdate,1,7) = '2017-04' group by name;

(2)查詢顧客的購買明細及月購買總額

select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from business;

(3)上述的場景,要將cost按照日期進行累加

select name,orderdate,cost, sum(cost) over() as sample1,--所有行相加 sum(cost) over(partition by name) as sample2,--按name分組,組內資料相加 sum(cost) over(partition by name order by orderdate) as sample3,--按name分組,組內資料累加 sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row ) as sample4 ,--和sample3一樣,由起點到當前行的聚合 sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and current row) as sample5, --當前行和前面一行做聚合 sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING AND 1 FOLLOWING ) as sample6,--當前行和前邊一行及后面一行 sum(cost) over(partition by name order by orderdate rows between current row and UNBOUNDED FOLLOWING ) as sample7 --當前行及后面所有行 from business;

(4)查看顧客上次的購買時間

select name,orderdate,cost, lag(orderdate,1,'1900-01-01') over(partition by name order by orderdate ) as time1, lag(orderdate,2) over (partition by name order by orderdate) as time2 from business;

(5)查詢前20%時間的訂單資訊

select * from (  select name,orderdate,cost, ntile(5) over(order by orderdate) sorted  from business) twhere sorted = 1;

6.7.6 Rank

1.函式說明

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

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

ROW_NUMBER() 會根據順序計算

2.資料準備

namesubjectscore
孫悟空語文87
孫悟空數學95
孫悟空英語68
大海語文94
大海數學56
大海英語84
宋宋語文64
宋宋數學86
宋宋英語84
婷婷語文65
婷婷數學85
婷婷英語78

3.需求

計算每門學科成績排名,

4.按需求查詢資料

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 score;

7.函式

7.1Hive函式分類

  • 從輸入輸出角度分類
    標準函式:一行資料中的一列或多列為輸入,結果為單一值
    聚合函式:多行的零列到多列為輸入,結果為單一值
    表生成函式:零個或多個輸入,結果為多列或多行
  • 從實作方式分類
    內置函式
    自定義函式:
    UDF:自定義標準函式
    UDAF:自定義聚合函式
    UDTF:自定義表生成函式

7.2內置函式

Hive提供大量內置函式供開發者使用

  • 標準函式
    字符函式
    型別轉換函式
    數學函式
    日期函式
    集合函式
    條件函式
  • 聚合函式
  • 表生成函式

7.2.1字符函式

回傳值函式描述
stringconcat(string|binary A, string|binary B…)對二進制位元組碼或字串按次序進行拼接
intinstr(string str, string substr)查找字串str中子字串substr出現的位置
intlength(string A)回傳字串的長度
intlocate(string substr, string str[, int pos])查找字串str中的pos位置后字串substr第一次出現的位置
stringlower(string A) /upper(string A)將字串A的所有字母轉換成小寫/大寫字母
stringregexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT)按正則運算式PATTERN將字串中符合條件的部分替換成REPLACEMENT所指定的字串
arraysplit(string str, string pat)按照正則運算式pat來分割字串str
stringsubstr(string|binary A, int start, int len)substring(string|binary A, int start, int len)對字串A,從start位置開始截取長度為len的字串并回傳
stringtrim(string A)將字串A前后出現的空格去掉
mapstr_to_map(text[, delimiter1, delimiter2])將字串str按照指定分隔符轉換成Map
binaryencode(string src, string charset)用指定字符集charset將字串編碼成二進制值

7.2.2 型別轉換函式和數學函式

回傳值型別轉換函式描述
“type”cast(expr as )將expr轉換成type型別 如:cast(“1” as BIGINT) 將字串1轉換成了BIGINT型別
binarybinary(string|binary)將輸入的值轉換成二進制
回傳值數學函式描述
DOUBLEround(DOUBLE a)回傳對a四舍五入的BIGINT值
binaryround(DOUBLE a, INT d)回傳對a四舍五入并保留d位小數位的值
BIGINTfloor(DOUBLE a)向下取整,如:6.10->6 -3.4->-4
DOUBLErand(INT seed)回傳一個DOUBLE型亂數,seed是隨機因子
DOUBLEpower(DOUBLE a, DOUBLE p)計算a的p次冪
DOUBLEabs(DOUBLE a)計算a的絕對值

7.2.3 日期函式

回傳值函式描述
stringfrom_unixtime(bigint unixtime[, string format])將時間戳轉換成format格式
intunix_timestamp()獲取本地時區下的時間戳
bigintunix_timestamp(string date)將格式為yyyy-MM-dd HH:mm:ss的時間字串轉換成時間戳
stringto_date(string timestamp)回傳時間字串的日期部分
intyear(string date)month/day/hour/minute/second/weekofyear回傳時間字串的年份部分回傳月/天/時/分/秒/第幾周
intdatediff(string enddate, string startdate)計算開始時間到結束時間相差的天數
stringdate_add(string startdate, int days)從開始時間startdate加上days
stringdate_sub(string startdate, int days)從開始時間startdate減去days
datecurrent_date回傳當前時間的日期
timestampcurrent_timestamp回傳當前時間戳
stringdate_format(date/timestamp/string ts, string fmt)按指定格式回傳時間date 如:date_format(“2016-06-22”,“MM-dd”)=06-22

7.2.4 集合函式

回傳值函式描述
intsize(Map<K.V>)回傳map中鍵值對個數
intsize(Array)回傳陣列的長度
arraymap_keys(Map<K.V>)回傳map中的所有key
arraymap_values(Map<K.V>)回傳map中的所有value
booleanarray_contains(Array, value)如該陣列Array包含value回傳true,,否則回傳false
arraysort_array(Array)對陣列進行排序

7.2.5 條件函式

回傳值函式描述
Tif(boolean testCondition, T valueTrue, T valueFalseOrNull)如果testCondition 為true就回傳valueTrue,否則回傳valueFalseOrNull
Tnvl(T value, T default_value)value為NULL回傳default_value,否則回傳value
TCOALESCE(T v1, T v2, …)回傳第一非null的值,如果全部都為NULL就回傳NULL
TCASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END如果a=b就回傳c,a=d就回傳e,否則回傳f
TCASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END如果a=ture就回傳b,c= ture就回傳d,否則回傳e
booleanisnull( a )如果a為null就回傳true,否則回傳false
booleanisnotnull ( a )如果a為非null就回傳true,否則回傳false

7.2.6 聚合函式和表生成函式

  • 聚合函式
    count、sum、max、min、avg、var_samp等
  • 表生成函式:輸出可以作為表使用
回傳值函式描述
N rowsexplode(array)對于array中的每個元素生成一行且包含該元素
N rowsexplode(MAP)每行對應每個map鍵值對其中一個欄位是map的鍵,另一個欄位是map的值
N rowsposexplode(ARRAY)與explode類似,不同的是還回傳各元素在陣列中的位置
N rowsstack(INT n, v_1, v_2, …, v_k)把k列轉換成n行,每行有k/n個欄位,其中n必須是常數
tuplejson_tuple(jsonStr, k1, k2, …)從一個JSON字串中獲取多個鍵并作為一個元組回傳,與get_json_object不同的是此函式能一次獲取多個鍵值

7.3 自定義UDF函式

Hive UDF開發流程

  • 繼承UDF類或GenericUDF類
  • 重寫evaluate()方法并實作函式邏輯
  • 編譯打包為jar檔案
  • 復制到正確的HDFS路徑
  • 使用jar創建臨時/永久函式
  • 呼叫函式

1.創建一個Maven工程Hive

https://blog.csdn.net/zmzdmx/article/details/108401283

2.匯入依賴

<dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>2.6.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>1.2.1</version>
    </dependency>

3.創建一個類

package cn.kgc.kb09;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;


public class TestUDF extends UDF {
    public Text evaluate(Text str){
        if(null==str){
            return null;
        }
        return new Text(str.toString().toUpperCase());
    }

    public static void main(String[] args) {
        TestUDF tu=new TestUDF();
        Text rst = tu.evaluate(new Text());
        System.out.println(rst);

    }
}

方法一(創建臨時函式):

4.打成jar包上傳到服務器/opt/testudf.jar

5.將jar包添加到hive的classpath(linux路徑)

add jar /opt/testudf.jar;

6.創建臨時函式與開發好的java class關聯

create temporary function mylower as "cn.kgc.kb09.TestUDF";

方法二(創建永久函式):

4.在linux命令列使用hdfs命令把jar包上傳到hdfs的路徑

hdfs dfs -put 路徑
create function 函式名 as ‘方法的全路徑’using as ‘jar包的hdfs路徑’

7.即可在hql中使用自定義的函式

select ename, mylower(ename) lowername from emp;

注意

  • 報錯在linux執行

報錯

java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask
	at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:294)
	at org.apache.commons.dbcp2.DelegatingStatement.execute(DelegatingStatement.java:291)
	at org.apache.commons.dbcp2.DelegatingStatement.execute(DelegatingStatement.java:291)
	at org.apache.zeppelin.jdbc.JDBCInterpreter.executeSql(JDBCInterpreter.java:736)
	at org.apache.zeppelin.jdbc.JDBCInterpreter.interpret(JDBCInterpreter.java:819)
	at org.apache.zeppelin.interpreter.LazyOpenInterpreter.interpret(LazyOpenInterpreter.java:103)
	at org.apache.zeppelin.interpreter.remote.RemoteInterpreterServer$InterpretJob.jobRun(RemoteInterpreterServer.java:632)
	at org.apache.zeppelin.scheduler.Job.run(Job.java:188)
	at org.apache.zeppelin.scheduler.ParallelScheduler$JobRunner.run(ParallelScheduler.java:162)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

執行命令,不行就退出hive,再次執行

zip -d testUdf.jar 'META-INF/.SF' 'META-INF/.RSA' 'META-INF/*SF'
  • 臨時函式可以垮庫運行,永久函式需要庫名.函式名

8.性能優化

8.1 Hive事務

1.事務(Transaction )指一組單元化操作,這些操作要么都執行,要么都不執行

ACID特性:

  • Atomicity:原子性
  • Consistency:一致性
  • Isolation:隔離性
  • Durability:持久性

2.Hive事務的特點和局限

  • V0.14版本開始支持行級事務
    • 支持INSERT、DELETE、UPDATE(v2.2.0開始支持Merge)
    • 檔案格式只支持ORC
  • 局限
    • 表必須是bucketed表
    • 需要消耗額外的時間、資源和空間
    • 不支持開始、提交、回滾、桶或磁區列上的更新
    • 鎖可以為共享鎖或排它鎖(串聯的而不是并發)
    • 不允許從一個非ACID連接讀寫ACID表
    • 使用較少

3. Hive事務的開啟和設定

  • 通過Hive命令列方式設定,當前session有效
  • 通過組態檔設定,全局有效
  • 通過UI工具(如Ambari)設定
-- 通過命令列方式開啟事務
set hive.support.concurrency = true;
set hive.enforce.bucketing = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.compactor.initiator.on = true;
set hive.compactor.worker.threads = 1; 
-- 通過組態檔hive-site.xml
<property> 
<name>hive.support.concurrency</name> 
<value>true</value>
 </property>
 <property> 
<name>hive.txn.manager</name> <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>

image-20200922222612920

8.2 Hive PLSQL

  • Hive PLSQL:Hive存盤程序(v2.0之后)
    • 支持SparkSQL和Impala
    • 兼容Oracle、DB2、MySQL、TSQL標準
    • 使將現有的程序遷移到Hive變得簡單和高效
    • 使撰寫UDF不需要Java技能
    • 它的性能比Java UDF稍微慢一些
    • 功能較新
  • 在Hive2 bin目錄下運行./hplsql
./hplsql -f plsql_demo.pl
RETURNS STRING 
BEGIN RETURN 'Hello, ' || text || '!'; 
END;
Print hello(' word') 

CREATE PROCEDURE getCount()
BEGIN DECLARE cnt INT = 0;	
SELECT COUNT(*) INTO cnt FROM employee;
PRINT 'Users cnt: ' || cnt;
END;
call getCount();

8.3 Hive性能調優工具

1.EXPLAIN

image-20200922222805776

2.ANALYZE

  • ANALYZE:分析表資料,用于執行計劃選擇的參考
    • 收集表的統計資訊,如行數、最大值等
    • 使用時呼叫該資訊加速查詢
  • 語法
ANALYZE TABLE employee COMPUTE STATISTICS; 

ANALYZE TABLE employee_partitioned 
PARTITION(year=2014, month=12) COMPUTE STATISTICS;

ANALYZE TABLE employee_id COMPUTE STATISTICS 
FOR COLUMNS employee_id;

8.4 Hive優化設計

  • 使用磁區表、桶表
  • 使用索引
  • 使用適當的檔案格式,如orc, avro, parquet
  • 使用適當的壓縮格式,如snappy
  • 考慮資料本地化 - 增加一些副本
  • 避免小檔案
  • 使用Tez引擎代替MapReduce
  • 使用Hive LLAP(在記憶體中讀取快取)
  • 考慮在不需要時關閉并發

8.5 Job優化

1.本地模式運行

Hive支持將作業自動轉換為本地模式運行
當要處理的資料很小時,完全分布式模式的啟動時間比作業處理時間要長

-- 通過以下設定開啟本地模式
SET hive.exec.mode.local.auto=true; --default false 
SET hive.exec.mode.local.auto.inputbytes.max=50000000; 
SET hive.exec.mode.local.auto.input.files.max=5; --default 4

  • Job必須滿足以下條件才能在本地模式下運行
    Job總輸入大小小于 hive.exec.mode.local.auto. inputbytes.max
    map任務總數小于 hive.exec.mode.local.auto. input.files.max
    所需的Reduce任務總數為1或0

2.JVM重用(JVM Reuse)

  • 通過JVM重用減少JVM啟動的消耗
    • 默認每個Map或Reduce啟動一個新的JVM
    • Map或Reduce運行時間很短時,JVM啟動程序占很大開銷
    • 通過共享JVM來重用JVM,以串行方式運行MapReduce Job
    • 適用于同一個Job中的Map或Reduce任務
    • 對于不同Job的任務,總是在獨立的JVM中運行
-- 通過以下設定開啟JVM重用
set mapred.job.reuse.jvm.num.tasks = 5;  -- 默認值為1

3.并行執行

  • 并行執行可提高集群利用率
    • Hive查詢通常被轉換成許多按默認順序執行的階段
    • 這些階段并不總是相互依賴的
    • 它們可以并行運行以節省總體作業運行時間
    • 如果集群的利用率已經很高,并行執行幫助不大
-- 通過以下設定開啟并行執行
SET hive.exec.parallel=true;  -- default false 
SET hive.exec.parallel.thread.number=16;  -- default 8,定義并行運行的最大數量

8.6 查詢優化

  • 自動啟動Map端Join
  • 防止資料傾斜
set hive.optimize.skewjoin=true;	
  • 啟用CBO(Cost based Optimizer)

    set hive.cbo.enable=true; 
    set hive.compute.query.using.stats=true; 
    set hive.stats.fetch.column.stats=true; 
    set hive.stats.fetch.partition.stats=true;	
    

    啟動Vectorization(矢量化)

    set hive.vectorized.execution.enabled = true; 
    set hive.vectorized.execution.reduce.enabled = true;
    
    

    使用CTE、臨時表、視窗函式等正確的編碼約定

8.7 壓縮演算法

  • 減少傳輸資料量,會極大提升MapReduce性能
  • 采用資料壓縮是減少資料量的很好的方式
  • 常用壓縮方法對比
壓縮方式可分割壓縮后大小壓縮解壓速度
gzip
lzo
snappy

nappy

  • 考慮資料本地化 - 增加一些副本
  • 避免小檔案
  • 使用Tez引擎代替MapReduce
  • 使用Hive LLAP(在記憶體中讀取快取)
  • 考慮在不需要時關閉并發

8.5 Job優化

1.本地模式運行

Hive支持將作業自動轉換為本地模式運行
當要處理的資料很小時,完全分布式模式的啟動時間比作業處理時間要長

-- 通過以下設定開啟本地模式
SET hive.exec.mode.local.auto=true; --default false 
SET hive.exec.mode.local.auto.inputbytes.max=50000000; 
SET hive.exec.mode.local.auto.input.files.max=5; --default 4

  • Job必須滿足以下條件才能在本地模式下運行
    Job總輸入大小小于 hive.exec.mode.local.auto. inputbytes.max
    map任務總數小于 hive.exec.mode.local.auto. input.files.max
    所需的Reduce任務總數為1或0

2.JVM重用(JVM Reuse)

  • 通過JVM重用減少JVM啟動的消耗
    • 默認每個Map或Reduce啟動一個新的JVM
    • Map或Reduce運行時間很短時,JVM啟動程序占很大開銷
    • 通過共享JVM來重用JVM,以串行方式運行MapReduce Job
    • 適用于同一個Job中的Map或Reduce任務
    • 對于不同Job的任務,總是在獨立的JVM中運行
-- 通過以下設定開啟JVM重用
set mapred.job.reuse.jvm.num.tasks = 5;  -- 默認值為1

3.并行執行

  • 并行執行可提高集群利用率
    • Hive查詢通常被轉換成許多按默認順序執行的階段
    • 這些階段并不總是相互依賴的
    • 它們可以并行運行以節省總體作業運行時間
    • 如果集群的利用率已經很高,并行執行幫助不大
-- 通過以下設定開啟并行執行
SET hive.exec.parallel=true;  -- default false 
SET hive.exec.parallel.thread.number=16;  -- default 8,定義并行運行的最大數量

8.6 查詢優化

  • 自動啟動Map端Join
  • 防止資料傾斜
set hive.optimize.skewjoin=true;	
  • 啟用CBO(Cost based Optimizer)

    set hive.cbo.enable=true; 
    set hive.compute.query.using.stats=true; 
    set hive.stats.fetch.column.stats=true; 
    set hive.stats.fetch.partition.stats=true;	
    

    啟動Vectorization(矢量化)

    set hive.vectorized.execution.enabled = true; 
    set hive.vectorized.execution.reduce.enabled = true;
    
    

    使用CTE、臨時表、視窗函式等正確的編碼約定

8.7 壓縮演算法

  • 減少傳輸資料量,會極大提升MapReduce性能
  • 采用資料壓縮是減少資料量的很好的方式
  • 常用壓縮方法對比
壓縮方式可分割壓縮后大小壓縮解壓速度
gzip
lzo
snappy
bzip2

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/124808.html

標籤:其他

上一篇:資料庫—查詢陳述句中left join怎么用?以及right join怎么用?

下一篇:Gurobi安裝詳細指南-2020最新版

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more