前言:老劉不敢說寫的有多好,但敢保證盡量用大白話把自己復習的知識點詳細解釋出來,拒絕資料上的生搬硬套,做到有自己的了解!
01 hive知識點(1)
第1點:數據倉庫的概念
由於hive它是基於hadoop的一個數據倉庫工具,老劉先講講數據倉庫的一些東西,再開始講hive。
數據倉庫,聽名字就知道它是用來存放數據的一個倉庫,倉庫不同於工程,倉庫只用來存放東西,不生產,也不消耗。
精簡的講,數據倉庫它本身不生產數據,也不會消耗數據,數據從外部來,供給外部使用,主要用於數據分析,對企業的支持決策做一些輔助。
第2點:數據倉庫的特征
數據倉庫有4個特征:
面向主題的:就是說它都是有目的的進行構建數據倉庫,用它干某件事;
集成的:就是說將所有用到的數據都集成到一起;
非易失的:就是說里面的數據一般都不會改變;
時變的:就是說隨着時間的發展,數據倉庫的分析手段也會發生改變。
第3點:數據倉庫和數據庫的區別
看到之前講的數據倉庫概念就知道,這兩個區別大了。
首先舉個例子,客戶在銀行做的每筆交易都會寫入數據庫,被記錄下來,就相當於用數據庫記賬。
而數據倉庫是分析系統的數據平台,它從事務系統獲取數據,並做匯總、加工,為決策者提供決策的一些依據。
比如,某銀行某分行一個月發生多少交易,該分行當前存款余額是多少。如果存款又少,消費交易又多,那么該地區就有必要設立ATM了。
接着要說的是,數據庫和數據倉庫的區別實際上講的是OLTP和OLAP的區別。
操作性處理,OLTP聯機事務處理,也可以叫做面向交易的處理系統,它是針對於具體業務在數據庫聯機的日常操作,通常對記錄進行查詢、修改,人們一般關心操作的響應時間、數據是否安全、完整和並發的相關問題。
分析型處理,聯機分析處理OLAP,一般針對於某些主題的歷史數據進行分析,支持管理決策。
總結一下就是,數據倉庫的出現,不是為了取代數據庫。
數據庫是面向事務的設計,數據倉庫是面向主題的設計。
數據庫存儲的一般是業務數據,數據倉庫存儲的一般是歷史數據。
數據庫是為了捕獲數據設計的,而數據倉庫是為了分析數據設計的。
還有一點就是,數據倉庫是在數據庫已經大量存在的情況下,為了進一步挖掘數據資源,為了進行決策而產生的。
第4點:數據倉庫分層
首先說說數據倉庫可分為三層:
源數據層(ODS):它主要用於保管我們的原始數據;
數據倉庫層(DW):它主要對源數據層過來的數據進行清洗,然后用於數據分析,大部分工作都是在這一層寫sql;
數據應用層(APP):它主要用於數據的各種展示。
那為什么要進行數據倉庫分層呢?
首先想想,一個非常復雜的問題,我們一般怎么解決,是不是通常把一個復雜的問題,分解成很多小問題,每個小問題相對於這個大問題,是不是相對容易點。
總結一下就說,對數據倉庫進行分層,相當於把一個復雜的工作拆成多個簡單的工作,每一層的處理邏輯相對簡單和容易理解,這樣我們比較容易保證每一個步驟的正確性,就算數據出現錯誤,我們也可以相對容易找到哪里出錯,快速糾正錯誤。
進行數據倉庫分層,達到了用空間換時間的效果,通過大量的預處理提升系統的效率。
第5點:hive是什么
簡單一句話,由於mapreduce代碼非常復雜,hive就是一個把SQL語句轉換為mapreduce任務的工具,通過hive大大簡化了mr的開發。
也可以這樣說,hive的主要的工作就是將我們寫的sql語句翻譯成為mr的任務,運行在yarn上面,hive可以簡單的理解為mr的客戶端
第6點:hive和數據庫的區別
區別太多了只說一點,Hive 不支持記錄級別的增刪改操作。
早期的版本,hive不支持,增刪改,只支持查詢操作,現在的版本,都支持。
但是實際工作當中不會用到增刪改,只會用到查詢操作select。
剩下的,大家自己去搜搜。
hive它只具有SQL數據庫的外表,但應用場景完全不同。由於執行器MapReduce執行速度特別慢,hive只能做離線數據的處理。
第7點:hive的架構
用戶接口:提供用戶通過各種方式來訪問hive,可以通過jdbc,可以通過hiveserver2,還可以通過hive shell;
解析器:主要就是用於解析sql語法;
編譯器:將解析之后的sql語法進行編譯成為MR的任務;
優化器:有一定的優化功能,自動的會對我們寫的sql語句進行調優,調優的功能有限的;
執行器:提交mr的任務到yarn上面去執行的;
底層的hadoop:數據存儲hdfs,數據的計算mr,運行在yarn上面的。
第8點:hive的數據類型
第9點:hive的DDL操作
可能會有人認為hive的DDL操作,以后直接百度或者翻資料就行,壓根不用記,但是在老劉看來,至少要記住幾個常用的命令,萬一哪天別人問,自己想不起來,還要去百度搜一下,多尷尬啊!
首先說說hive的數據庫操作:
1、創建數據庫 create database if not exists db_hive; 2、顯示所有數據庫 show databases; 3、查詢數據庫 show databases like 'gmall'; 4、查看數據庫詳情 desc database gmall; 5、顯示數據庫詳細信息 desc database extended gmall; 6、切換當前數據庫 use gmall; 7、刪除數據庫 如果刪除的數據庫不存在,最好采用if exists 判斷數據庫是否存在 drop database if exists gmall; 如果數據庫中有表存在,這里需要使用cascade強制刪除數據庫 drop database if exists gmall cascade;
接下里說說hive的DDL操作:
它有一個建表的語法,如果直接看這個語法,老劉不建議直接看,通過例子慢慢了解,查漏補缺最好。
hive建表分為內部表和外部表,首先講創建內部表。
1、直接建表 先切換到自己要用的數據庫 use myhive; create table stu(id int,name string); 2、通過AS 查詢語句完成建表:將子查詢的結果存在新表里,有數據 create table if not exists myhive.stu1 as select id, name from stu; 3、根據已經存在的表結構創建表 create table if not exists myhive.stu2 like stu; 4、查詢表的類型 desc formatted myhive.stu;
根據查詢表的類型,可以得到這張圖,這張圖包含了很多信息,后續會慢慢講述到,大家放心!
一般最常用的就是創建內部表並指定字段之間的分隔符,指定文件的存儲格式,以及數據存放的位置,注意這個數據存放的位置指的是在HDFS上的存儲位置,千萬不要記錯了,老劉最開始就記錯了!
創建的代碼如下:
create table if not exists myhive.stu3(id int ,name string) row format delimited fields terminated by '\t' stored as textfile location '/user/stu2';
現在開始創建外部表,首先要知道什么是外部表,和內部表有什么區別?
外部表因為是指定其他的hdfs路徑的數據加載到表當中來,所以hive表會認為自己不完全獨占這份數據,所以刪除hive表的時候,數據仍然存放在hdfs當中,不會刪掉。
創建外部表的時候需要加上external關鍵字,location字段可以指定,也可以不指定,指定就是數據存放的具體目錄,不指定就是使用默認目錄 /user/hive/warehouse。
創建代碼如下:
create external table myhive.teacher (t_id string,t_name string) row format delimited fields terminated by '\t';
總結一下內部表與外部表的區別:
1、外部表在創建的時候需要加上external關鍵字。
2、內部表刪除后,表的元數據和真實數據都被刪除了;但是外部表刪除后,僅僅只是把該表的元數據刪除了,真實數據還在,后期還是可以恢復出來。
那我們一般什么時候使用內部與外部表呢?
由於內部表刪除表的時候會同步刪除HDFS的數據文件,所以如果我們確定一個表僅僅是我們自己獨占使用,其他人不適用的時候就可以創建內部表,如果一個表的文件數據,其他人也要使用,那么就創建外部表。
一般外部表都是用在數據倉庫的ODS層,內部表都是用在數據倉庫的DW層。
那表創建好之后,如何把數據導進去呢?一般使用load的方式來加載數據到內部表或者外部表,不用insert。
load數據可以從本地文件系統加載或者也可以從hdfs上面的數據進行加載,注意本地系統指的是linux系統。
① 從本地系統加載數據到表里面
首先創建在本地系統創建一個文件,把數據表上傳到這個文件里,然后在把這個文件上傳到表里。
mkdir -p /kkb/install/hivedatas load data local inpath '/kkb/install/hivedatas/teacher.csv' into table myhive.teacher;
注意,本地系統導入要加上一個local;
② 從hdfs上面導入數據
首先在hdfs上創建一個目錄,把數據文件上傳上去,然后在把這個文件上傳到表里。
hdfs dfs -mkdir -p /kkb/hdfsload/hivedatas hdfs dfs -put teacher.csv /kkb/hdfsload/hivedatas # 在hive的客戶端當中執行 load data inpath '/kkb/hdfsload/hivedatas' overwrite into table myhive.teacher;
第10點:hive的分區表
Hive中的分區就是分目錄,把表的數據分目錄存儲,存儲在不同的文件夾下,后期按照不同的目錄查詢數據,不需要進行全量掃描,提升查詢效率。
創建分區表語法:
create table score(s_id string,c_id string, s_score int) partitioned by (month string) row format delimited fields terminated by '\t';
創建一個表多個分區:
create table score2 (s_id string,c_id string, s_score int) partitioned by (year string,month string,day string) row format delimited fields terminated by '\t';
接下來就是把數據加載到分區表中,老劉覺得這些需要掌握,大家認真點!加載數據到分區表當中去
load data local inpath '/kkb/install/hivedatas/score.csv' into table score partition (month='201806');
加載數據到多分區表當中去
load data local inpath '/kkb/install/hivedatas/score.csv' into table score2 partition(year='2018',month='06',day='01');
第11點:綜合練習
這一點是老劉唯一覺得一些資料上講的不錯的地方,在經歷了大量的基礎DDL操作后,能加速記住這些操作的唯一方法就是做一個小練習,下面就是關於hive基礎操作的一個小練習。
需求描述:現在有一個文件score.csv文件,里面有三個字段,分別是s_id string, c_id string,s_score int,字段都是使用 \t進行分割,存放在集群的這個目錄下/scoredatas/day=20180607,這個文件每天都會生成,存放到對應的日期文件夾下面去,文件別人也需要公用,不能移動。需求,創建hive對應的表,並將數據加載到表中,進行數據統計分析,且刪除表之后,數據不能刪除。
根據這些需求,我們可以知道的是要創建一個外部分區表,但是有意思的是老劉看的資料上,它並不是先建表再導入數據,它是先導入數據后再建立表,非常有意思。
cd /kkb/install/hivedatas/ hdfs dfs -mkdir -p /scoredatas/day=20180607 hdfs dfs -put score.csv /scoredatas/day=20180607/
數據文件導入后,再建立外部分區表,並指定文件數據存放目錄。
create external table score4(s_id string, c_id string,s_score int) partitioned by (day string) row format delimited fields terminated by '\t' location '/scoredatas';
進行數據查詢,發現表里面並沒有數據。
是這樣的,如果我們先建立分區表再通過load導入數據,表里面肯定會有數據的;
如果直接將文件放在hdfs上面對應的位置,即使我們表指定的存儲位置和上傳數據的位置一致,但由於mysql里面就沒有記錄元數據分區的信息,就沒有數據,就需要進行修復,刷新mysql元數據信息即可。
有一個知識點就是hive的元數據存在於mysql中,在mysql中會有一個hive庫,存放相應的表,一共53張表。
當然就像老劉之前說的,先建立表,在通過load導入數據,表里面是絕對有數據的。
02 總結
hive的知識點主要偏實踐,在學習過程中要進行大量的練習,才能真正的掌握。老劉盡量用大白話對hive的第一部分知識點進行了講解,希望能夠幫助到大家。有什么想說的,可以直接聯系公眾號:努力的老劉!