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

前言:老劉不敢說寫的有多好,但敢保證儘可能用大白話把本身複習的知識點詳細解釋出來,拒絕資料上的生搬硬套,作到有本身的瞭解!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的第一部分知識點進行了講解,但願可以幫助到你們。有什麼想說的,能夠直接聯繫公衆號:努力的老劉!

相關文章
相關標籤/搜索