大白話詳解大資料hive知識點,老劉真的很用心(1)
前言:老劉不敢說寫的有多好,但敢保證儘量用大白話把自己複習的知識點詳細解釋出來,拒絕資料上的生搬硬套,做到有自己的瞭解!
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的第一部分知識點進行了講解,希望能夠幫助到大家。有什麼想說的,可以直接聯絡公眾號:努力的老劉!