1.數據倉庫node
2.hive介紹mysql
3.hive的操做正則表達式
4.hive參數sql
5.hive函數(udf)shell
6.hive數據壓縮數據庫
7.hive存儲格式json
8.存儲和壓縮相結合session
9.hive調優架構
數據倉庫:用於存儲大量的歷史歷史數據。簡稱DW或者DWH,databasewarehouse,用於面向企業提供決策支持。函數
數據倉庫:既不生產數據,又不消耗數據,只是用於對數據的存儲。
糧倉:既不消耗糧食,又不生產糧食,只是用於糧食的存儲。
1)面向主題:把系統數據集成到一塊兒,按照一個層面進行數據的分析。
2)集成性:將多個子系統的數據集成到一塊兒,進行數據分析。
3)非易失性:數據倉庫中的數據不會輕易的刪除。
4)時變性:數據會隨着時間進行更新。
OLTP:在線聯機事務處理On-Line Transaction Processing(),針對數據事務的處理,主要應用在數據庫中。
OLAP:在線聯機分析處理(On-Line Analytical Processing),針對歷史數據的分析,用於企業的決策支持。
1)數據源層(ods層,貼源層):最原始的數據
2)數據倉庫層:經過ETL進行數據的處理,而且進行數據的分析。
ETL(抽取Extra, 轉化Transfer, 裝載Load)
3)數據應用層:對分析結果一個直觀的展現(圖表和報表)
用空間換時間。
元數據:是數據和數據模型之間的一個對應(映射)關係。
hive是Hadoop的數據倉庫工具,用於分析結構化的數據。是經過類sql的方式,hql:hive sql。
結構化數據:好比關係型數據庫中的數據。文本(特定的文本格式,經過分隔符進行分割)
半結構化數據:好比json, xml
非結構化數據:好比視頻
hive中數據存儲:數據實際存儲在hdfs上。
hive中sql查詢:sql的執行最終會轉換爲mapreduce,完成查詢操做。
使用hive的緣由:
select * from user;
select * from product left join order on product.id = order.pid;
hive 使用sql完成數據的分析工做。
hive的特色:
1)可擴展
hadoop集羣的節點可擴展
2)延展性
能夠擴展相關的功能1,如udf。
3)容錯
節點出現問題,sql仍可執行。
1)hive的用戶接口
hive的客戶端:shell/cli jdbc
2)hive的解析器
編譯器:將sql進行拆分和解析
優化器:將執行的sql進行語法優化
執行器:進行數據查詢並返回結果
3)hive的執行和落地點:
hive執行:mapreduce
落地點:數據最終存儲到hdfs上
執行經過mapreduce,存儲在hdfs上
hive的sql實際是一個離線分析
hive數據最終存儲在hdfs上
hive存儲格式:text sequencefile qarquetfile orc
1)bin/hive
bin/hive 客戶端鏈接
2)hive jdbc方式鏈接
bin/hive --service hiveserver2 #使用jdbc鏈接的方式,首先要啓動hiveserver2服務
後臺啓動:
nohup bin/hive --service hiveserver2 2>&1 &
bin/beeline
!connect jdbc:hive2://node03:10000 #hive的jdbc url地址
hive的用戶名:和hadoop安裝的用戶名一致 root
hive的密碼:任意密碼
注意:在使用beeline前,要使用bin/hive 鏈接一次,目的是讓mysql數據庫自動生成元數據信息。
3)hive參數的方式
hive -e 「select * from test;」
hive -f hive.sql #執行腳本文件
3.HIVE的基本操做
create database if not exists myhive;
use myhive;
默認數據庫存放位置:
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
能夠經過hive-site.xml修改默認保存地址
執行表的存儲位置:
create database myhive2 location '/myhive2'
修改數據庫
注意:只能修改數據庫的屬性,數據庫名和存儲地址不能修改。
alter database myhive2 set dbproperties('createtime'='20180611');
查看信息:
desc database myhive2;
desc database extended myhive2;
刪除數據庫:
drop database myhive2 cascade; #若是數據庫下有表,會一塊兒刪除
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name #建立一張表 external 外部
[(col_name data_type [COMMENT col_comment], ...)] #字段和字段類型
[COMMENT table_comment] #表的註釋
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] #PARTITIONED BY表分區,分的是文件夾
[CLUSTERED BY (col_name, col_name, ...) #CLUSTERED BY 表分桶,分的是文件
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] #SORTED BY 排序
[ROW FORMAT row_format] #ROW FORMAT 數據的格式化 默認對每個字段的分割 ''\001'
[STORED AS file_format] #STORED AS 數據存儲格式
[LOCATION hdfs_path] #LOCATION 數據存儲路徑
由hive管理的表,當刪除表的時候,數據也會隨之刪除。
建立表的時候,不加external關鍵字,就是內部表。
建立表並指定字段之間的分隔符:
create table if not exists stu2(id int ,name string) row format delimited fields terminated by '\t'stored as textfile location '/user/stu2';
一張表不止由hive本身管理。當刪除表的時候,不會刪除數據。
外部表的建立須要加上external關鍵字。
建立教師外部表:
create external table teacher (t_id string,t_name string) row format delimited fields terminated by '\t';
建立學生外部表:
create external table student (s_id string,s_name string,s_birth string , s_sex string ) row format delimited fields terminated by '\t';
數據的加載:
load data local inpath '/export/servers/hivedatas/student.csv' into table student;
加上overwrite 表明覆蓋現有數據
load data local inpath '/export/servers/hivedatas/student.csv' overwrite into table student;
加載hdfs上的數據
load data inpath '/hivedatas/teacher.csv' into table teacher;
按照指定的字段,進行數據目錄的劃分。核心思想:分而治之。
語法:partitioned by (month string)
建立分區:
create table score(s_id string,c_id string,s_score int) partitioned by (month string) row format delimited fields terminated by '\t';
加載數據:
load data local inpath '/export/servers/hivedatas/score.csv' into table score partition (month='201806');
分區聯合查詢使用union all來實現
select * from score where month = '201806' union all select * from score where month = '201806'
查看分區
show partititions score;
添加一個分區
alter table score add partition(month='201805');
刪除分區
alter table score drop partition(month = '201806');
需求描述:如今有一個文件score.csv文件,存放在集羣的這個目錄下/scoredatas/month=201806,這個文件天天都會生成,存放到對應的日期文件夾下面去,文件別人也須要公用,不能移動。需求,建立hive對應的表,並將數據加載到表中,進行數據統計分析,且刪除表以後,數據不能刪除
1)外部表:
2)分區表:month=201806
3)指定存儲目錄
create external table score3(s_id string, c_id string, s_score int) partitioned by (month string) row format delimited fields terminated by '\t' location '\scoredats';
進行表的修復,說白了就是創建咱們表與咱們數據文件之間的一個關係映射
msck repair table score4;
將數據按照指定的字段進行劃分,分到不一樣的文件中去。
語法:clustered by (id) into 3 buckets
開啓hive的桶表功能
set hive.enforce.bucketing=true;
設置reduce的個數
set mapreduce.job.reduces=3;
建立通表
create table course (c_id string,c_name string,t_id string) clustered by(c_id) into 3 buckets row format delimited fields terminated by '\t';
分桶表數據的加載不能使用load的方式,須要經過間接從普通表查詢數據插入的方式加載數據。
建立普通表
create table course_common (c_id string,c_name string,t_id string) row format delimited fields terminated by '\t';
經過insert overwrite給桶表中加載數據
insert overwrite table course select * from course_common cluster by(c_id);
1)重命名:
alter table score4 rename to score5;
(2)添加列
alter table score5 add columns (mycol string, mysco string);
(3)查詢表結構
desc score5;
(4)更新列
alter table score5 change column mysco mysconew int;
(5)查詢表結構
desc score5;
(6)刪除表
drop table test;
1)經過load方式加載數據
load data local inpath '/export/servers/hivedatas/score.csv' overwrite into table score partition(month='201806');
2) 經過查詢方式加載數據
create table score4 like score;
insert overwrite table score4 partition(month = '201806') select s_id,c_id,s_score from score;
多插入模式:
score s_id,c_id,s_score
字表:score1 s_id,c_id
score2 c_id s_score
from score
insert overwrite table score_first partition(month='201806') select s_id,c_id
insert overwrite table score_second partition(month = '201806') select c_id,s_score;
清空表數據:
truncate table score6;
SELECT [ALL | DISTINCT] select_expr, select_expr, ... #查詢字段
FROM table_reference #查詢表
[WHERE where_condition] #查詢條件
[GROUP BY col_list [HAVING condition]] #分組,數據的過濾
[CLUSTER BY col_list #
| DISTRIBUTE BY col_list #DISTRIBUTE BY 將數據按照分區進行查詢
#ORDER BY 排序(只能設置一個renduce,全局 的排序)
#SORT BY 局部的排序,是在每個分區內部局部的排序
#DISTRIBUTE BY和SORT BY結合一塊兒使用
#CLUSTER BY = DISTRIBUTE BY(id)+SORT BY(id)
]
[LIMIT number] #limit 限定返回條數
select * from score;
select s_id ,c_id from score;
1)重命名一個列。
2)便於計算。
3)緊跟列名,也能夠在列名和別名之間加入關鍵字‘AS’
select s_id as myid ,c_id from score;
1)求總行數(count)
select count(1) from score;
2)求分數的最大值(max)
select max(s_score) from score;
3)求分數的最小值(min)
select min(s_score) from score;
4)求分數的總和(sum)
select sum(s_score) from score;
5)求分數的平均值(avg)
select avg(s_score) from score;
典型的查詢會返回多行數據。LIMIT子句用於限制返回的行數。
select * from score limit 3;
1)使用WHERE 子句,將不知足條件的行過濾掉。
2)WHERE 子句緊隨 FROM 子句。
3)案例實操
查詢出分數大於60的數據
select * from score where s_score > 60;
1)使用LIKE運算選擇相似的值
2)選擇條件能夠包含字符或數字:
% 表明零個或多個字符(任意個字符)。
_ 表明一個字符。
3)RLIKE子句是Hive中這個功能的一個擴展,其能夠經過Java的正則表達式這個更強大的語言來指定匹配條件。
4)案例實操
(1)查找以8開頭的全部成績
select * from score where s_score like '8%';
(2)查找第二個數值爲9的全部成績數據
select * from score where s_score like '_9%';
(3)查找成績中含9的全部成績數據
select * from score where s_score rlike '[9]';
GROUP BY語句一般會和聚合函數一塊兒使用,按照一個或者多個列隊結果進行分組,而後對每一個組執行聚合操做。
案例實操:
(1)計算每一個學生的平均分數
select s_id ,avg(s_score) from score group by s_id;
(2)計算每一個學生最高成績
select s_id ,max(s_score) from score group by s_id
1)having與where不一樣點
(1)where針對表中的列發揮做用,查詢數據;having針對查詢結果中的列發揮做用,篩選數據。
(2)where後面不能寫分組函數,而having後面可使用分組函數。
(3)having只用於group by分組統計語句。
2)案例實操:
求每一個學生的平均分數
select s_id ,avg(s_score) from score group by s_id;
求每一個學平生均分數大於85的人
select s_id ,avg(s_score) avgscore from score group by s_id having avgscore > 85;
1)等值join
用於多表之間的關聯,在hive中只能完成等值鏈接,join on o.pid =p.id
2)表別名
select * from teacher t join course c on t.t_id = c.t_id;
內鏈接(INNER JOIN)
內鏈接:只有進行鏈接的兩個表中都存在與鏈接條件相匹配的數據纔會被保留下來。
select * from teacher t inner join course c on t.t_id = c.t_id;
左外鏈接:JOIN操做符左邊表中符合WHERE子句的全部記錄將會被返回。
查詢老師對應的課程
select * from teacher t left join course c on t.t_id = c.t_id;
右外鏈接:JOIN操做符右邊表中符合WHERE子句的全部記錄將會被返回。
select * from teacher t right join course c on t.t_id = c.t_id;
滿外鏈接:將會返回全部表中符合WHERE語句條件的全部記錄。若是任一表的指定字段沒有符合條件的值的話,那麼就使用NULL值替代。
SELECT * FROM teacher t FULL JOIN course c ON t.t_id = c.t_id ;
1)全排序
order by:reduce的數量必須爲一個,是一個全局排序。
按照別名排序
按照分數的平均值排序
select s_id ,avg(s_score) avg from score group by s_id order by avg;
多個列排序
按照學生id和平均成績進行排序
select s_id ,avg(s_score) avg from score group by s_id order by s_id,avg;
2)Sort By局部排序
1)設置reduce個數
set mapreduce.job.reduces=3;
2)查看設置reduce個數
set mapreduce.job.reduces;
3)查詢成績按照成績降序排列
select * from score sort by s_score;
4)將查詢結果導入到文件中(按照成績降序排列)
insert overwrite local directory '/export/servers/hivedatas/sort' select * from score sort by s_score;
3)分區排序(DISTRIBUTE BY)
DISTRIBUTE by 按照指的字段將數據發送到reduce中進行數據的處理。
設置reduce的個數,將咱們對應的s_id劃分到對應的reduce當中去
set mapreduce.job.reduces=7;
經過distribute by 進行數據的分區
insert overwrite local directory '/export/servers/hivedatas/sort' select * from score distribute by s_id sort by s_score;
4)CLUSTER BY
按照指定字段分區,並排序(只有升序排序)
當distribute by和sort by字段相同時,可使用cluster by方式。
對於通常參數,有如下三種設定方式:
1)配置文件 hive-site.xml
2)命令行參數
bin/hive -hiveconf hive.root.logger=INFO,console
3) 參數聲明
set mapred.reduce.tasks=100;
這一設定的做用域也是session級的。
生效順序
參數聲明 > 命令行參數 > 配置文件參數(hive)
1)內置函數
1)查看系統自帶的函數
hive> show functions;
2)顯示自帶的函數的用法
hive> desc function upper;
3)詳細顯示自帶的函數的用法
hive> desc function extended upper;
2)hive自定義函數
1)udf:(User-Defined-Function)用戶自定義函數,一進一出
2)udaf:用戶自定義聚合函數,多進一出
3)udtf:UDTF(User-Defined Table-Generating Functions),一進多出
lateral view explore()