大白話詳解大資料hive知識點,老劉真的很用心(1)

努力的老劉發表於2020-12-09

前言:老劉不敢說寫的有多好,但敢保證儘量用大白話把自己複習的知識點詳細解釋出來,拒絕資料上的生搬硬套,做到有自己的瞭解!

 

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的第一部分知識點進行了講解,希望能夠幫助到大家。有什麼想說的,可以直接聯絡公眾號:努力的老劉!

 

相關文章