前言:老劉不敢說寫的有多好,但敢保證儘可能用大白話把本身複習的知識點詳細解釋出來,拒絕資料上的生搬硬套,作到有本身的瞭解!mysql
01 hive知識點(1)linux
第1點:數據倉庫的概念sql
因爲hive它是基於hadoop的一個數據倉庫工具,老劉先講講數據倉庫的一些東西,再開始講hive。shell
數據倉庫,聽名字就知道它是用來存放數據的一個倉庫,倉庫不一樣於工程,倉庫只用來存放東西,不生產,也不消耗。數據庫
精簡的講,數據倉庫它自己不生產數據,也不會消耗數據,數據從外部來,供給外部使用,主要用於數據分析,對企業的支持決策作一些輔助。安全
第2點:數據倉庫的特徵架構
數據倉庫有4個特徵:併發
面向主題的:就是說它都是有目的的進行構建數據倉庫,用它幹某件事;工具
集成的:就是說將全部用到的數據都集成到一塊兒;oop
非易失的:就是說裏面的數據通常都不會改變;
時變的:就是說隨着時間的發展,數據倉庫的分析手段也會發生改變。
第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';
總結一下內部表與外部表的區別:
一、外部表在建立的時候須要加上external關鍵字。
二、內部表刪除後,表的元數據和真實數據都被刪除了;可是外部表刪除後,僅僅只是把該表的元數據刪除了,真實數據還在,後期仍是能夠恢復出來。
那咱們通常何時使用內部與外部表呢?
因爲內部表刪除表的時候會同步刪除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的第一部分知識點進行了講解,但願可以幫助到你們。有什麼想說的,能夠直接聯繫公衆號:努力的老劉!