Hive數據倉庫實戰


前言

Hive作爲大數據平臺Hadoop之上的主流應用,公司一般都是用它作爲公司的數據倉庫,分佈式機器學習的訓練數據和數據處理也經常用它來處理,下面介紹下它的常用功能。

一、Hive原理和功能介紹

Hive是建立在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射爲一張數據庫表,並提供簡單的SQL查詢功能, Hive 定義了簡單的類 SQL 查詢語言,稱爲 HQL,它允許熟悉 SQL 的用戶查詢數據。

Hive可以將SQL語句轉換爲MapReduce任務進行運行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。同時,這個Hive也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和reducer無法完成的複雜的分析工作。比如UDF函數。

簡單來講,Hive從表面看來,你可以把他當成類似Mysql差不多的東西,就是個數據庫而已。按本質來講,他也並不是數據庫。其實他就是一個客戶端工具而已,真實數據是在Hadoop的HDFS分佈式文件系統上存着,知識它提供一種方便的方式讓你很輕鬆把數據從HDFS查詢數據和更新數據。Hive既然是一個客戶端工具,所以並不需要啓動什麼服務。說白了解壓就能用。操作方式通過寫類似Mysql的SQL語句對HDFS操作,提交SQL後,Hive會把SQL解析成MapReduce程序去執行,分佈式多臺機器並行的執行。當數據存入到HDFS後,大部分統計工作都可以通過寫Hive SQL的方式來完成,大大提高了工作效率。

二、Hive安裝部署

Hive的安裝部署非常簡單,因爲它本身是Hadoop的一個客戶端,不是一個集羣服務。所以把安裝包解壓,改改配置就可以用。在哪臺機器上登陸Hive客戶端就在哪臺機器上部署就可以了,不用在每臺服務器上都部署。安裝過程如下:

#上傳hive.tar.gz到/home/hadoop/software/hadoop2

cd /home/hadoop/software/hadoop2

tar xvzf hive.tar.gz

cd hive/conf

mv hive-env.sh.template hive-env.sh

mv hive-default.xml.template hive-site.xml

vim …/bin/hive-config.sh

#增加:

export JAVA_HOME=/home/hadoop/software/jdk1.8.0_121

export HIVE_HOME=/home/hadoop/software/hadoop2/hive

export HADOOP_HOME=/home/hadoop/software/hadoop2

1.然後修改hive-site.xml文件

修改以下配置字節點,主要是配置Hive的元數據存儲用Mysql,因爲默認的是Derby文件數據庫,實際公司用的時候都是改成用Mysql數據庫。

vim hive-site.xml

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://192.168.1.166:3306/chongdianleme_hive?createDatabaseIfNotExist=true</value>

</property>

<property>

<name>javax.jdo.option.ConnectionDriverName</name>

<value>com.mysql.jdbc.Driver</value>

</property>

<property>

<name>javax.jdo.option.ConnectionUserName</name><value>root</value>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>123456</value>

</property>

<property>

<name>hive.metastore.schema.verification</name>

<value>false</value>

<description>

</description>

</property>

因爲Hive默認沒有把Mysql的驅動jar包集成進去,需要我們手動上傳mysql-connector-java-.-bin.jar到/home/hadoop/software/hadoop2hive/lib目錄下,Hive客戶端啓動的時候會自動加載這個目錄下的所有jar包。

部署就這麼簡單,我們在Linux的客戶端輸入Hive回車就進去控制檯命令窗口,後面就可以建表、查詢數據、更新等操作了。下面我們看下Hive的常用SQL操作。

三、Hive SQL操作

Hive做查詢數據、更新數據前提需要先建表,有了表之後我們可以往表裏寫入數據,之後纔可以查詢和更新等操作。

1.建表操作

#建Hive表腳本

create EXTERNAL table IF NOT EXISTS ods_kc_fact_clicklog_tab(userid string,kcid string,time string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\t’

stored as textfile

location ‘/ods/kc/fact/ods_kc_fact_clicklog/’;

#EXTERNAL關鍵詞意思創建外部表,目的是外部表當您drop table 的時候數據不會刪除,只會刪掉表結構而已,表結構又叫做元數據。想恢復表結構只需要把這個表再創建一次就行,裏面的數據還存在。所以爲了保險防止誤操作,一般Hive數據倉庫都建外部表。

TERMINATED BY ‘\t’ #列之間分隔符

location ‘/ods/kc/fact/ods_kc_fact_clicklog/’;#數據存儲路徑

#建表就這麼簡單,但建表之前得先建數據庫,數據庫的創建命令:

create database chongdianleme;

然後選擇這個數據庫:use chongdianleme;

#Hive建表的字段類型如下:

#基礎數據類型:

Hive類型        說明         java類型      實例

1).tinyint 1byte有符號的整數    byte 20

2).smalint 2byte有符號的整數   short 20

3).int 4byte有符號的整數   int 20

4).bigint 8byte有符號的整數   long 20

5).boolean     布爾類型true或false boolean true

6).float      單精度         float 3.217

7).double    雙精度         double 3.212

8).string      字符序列,單雙即可   string ‘chongdianleme’;

9).timestamp    時間戳,精確的納秒 timestamp ‘158030219188’

10).binary      字節數組        byte[]

#集合數據類型:

hive類型      說明           java類型         實例

1).struct 對象類型,可以通過字段名.元素名來訪問object struct(‘name’,‘age’)

2).map 一組鍵值對的元組 map map(‘name’,‘zhangsan’,‘age’,‘23’)

3).array    數組  array array(‘name’,‘age’)

4).union          組合

#輸入hive回車,執行創建表命令

#創建數據庫命令

create database chongdianleme;

#使用這個數據庫

use chongdianleme;

示例:

#ods層事實表用戶查看點擊課程日誌:

create EXTERNAL table IF NOT EXISTS ods_kc_fact_clicklog_tab(userid string,kcid string,time string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\t’

stored as textfile

location ‘/ods/kc/fact/ods_kc_fact_clicklog_tab/’;

#ods層維表課程商品表:

create EXTERNAL table IF NOT EXISTS ods_kc_dim_product_tab(kcid string,kcname string,price float ,issale string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\t’

stored as textfile

location ‘/ods/kc/dim/ods_kc_dim_product_tab/’;

2.創建表之後我們就可以做一些查詢數據表的操作

1)查詢課程日誌表前幾條記錄

select * from ods_kc_fact_clicklog_tab limit 6;

2)導入一些數據到課程日誌表

因爲開始表裏沒數據,我們需要先導入數據進去。有多種方式導入,比如

(1)用Sqoop工具從Mysql導入;

(2)直接把文本文件放到Hive對應的HDFS目錄下。

cd /home/hadoop/chongdianleme

#rz上傳

#通過Hadoop命令上傳本地文件到hive表對用的hdfs目錄:

hadoop fs -put kclog.txt /ods/kc/fact/ods_kc_fact_clicklog_tab/

#查看下此目錄,可以看到在這個Hive表目錄下有數據了:

$ hadoop fs -ls /ods/kc/fact/ods_kc_fact_clicklog_tab/

Found 1 items

-rw-r–r-- 3 hadoop supergroup 590 2019-05-29 02:16 /ods/kc/fact/ods_kc_fact_clicklog_tab/kclog.txt

#通過Hadoop的tail命令我們可以查看此目錄的文件最後幾條記錄:

$ hadoop fs -tail /ods/kc/fact/ods_kc_fact_clicklog_tab/kclog.txt

u001 kc61800001 2019-06-02 10:01:16

u001 kc61800002 2019-06-02 10:01:17

u001 kc61800003 2019-06-02 10:01:18

u002 kc61800006 2019-06-02 10:01:19

u002 kc61800007 2019-06-02 10:01:20

#然後上傳課程商品表

cd /home/hadoop/chongdianleme

#rz上傳

hadoop fs -put product.txt /ods/kc/dim/ods_kc_dim_product_tab/

#查看記錄

hadoop fs -tail /ods/kc/dim/ods_kc_dim_product_tab/product.txt

3)簡單的查詢課程日誌表SQL語句

#查詢前幾條

select * from ods_kc_fact_clicklog_tab limit 6;

#查詢總共有多少條記錄

select count(1) from ods_kc_fact_clicklog_tab;

#查看有多少用戶

select count(distinct userid) from ods_kc_fact_clicklog_tab;

#查看某個用戶的課程日誌

select * from ods_kc_fact_clicklog_tab where userid=‘u001’;

#查看大於等於某個時間的日誌

select * from ods_kc_fact_clicklog_tab where time>=‘2019-06-02 10:01:19’;

#查看在售,並且價格大於2000的日誌

select * from ods_kc_dim_product where issale=‘1’ and price>2000;

#查看在售,或者價格大於2000的日誌

select * from ods_kc_dim_product where issale=‘1’ or price>2000;

4)以\001分隔符建表

#以\001分割是Hive建表中常用的規範,之前用的\t分隔符容易被用戶輸入,數據行裏如果存在\t分隔符,會和Hive表裏的\t分隔符混淆,這樣這一行數據會多出幾列,造成列錯亂。

#ods層維表用戶查看點擊課程日誌事實表:

create EXTERNAL table IF NOT EXISTS ods_kc_fact_clicklog(userid string,kcid string,time string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/ods/kc/fact/ods_kc_fact_clicklog/’;

#ods層維表用戶查看點擊課程基本信息維度表:

create EXTERNAL table IF NOT EXISTS ods_kc_dim_product(kcid string,kcname string,price float ,issale string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/ods/kc/dim/ods_kc_dim_product/’;

5)基於SQL查詢結果集來更新數據表

#把查詢sql語句的結果集合導出到另外一張表,用insert overwrite table

這是更新數據表的常用方式,通過insert overwrite table可以把指定的查詢結果集合插入到這個表,插入前先把表清空。如果不加overwrite關鍵詞,就不會清空,而是在原來的數據上追加。

#先查詢下ods_kc_fact_clicklog這個表有沒有記錄。

select * from chongdianleme.ods_kc_fact_clicklog limit 6;

#把查詢結果導入到這個\001分割的表,課程日誌表

insert overwrite table chongdianleme.ods_kc_fact_clicklog select userid,kcid,time from chongdianleme.ods_kc_fact_clicklog_tab;

#再查看下導入的結果

select * from chongdianleme.ods_kc_fact_clicklog limit 6;

#課程商品表

insert overwrite table chongdianleme.ods_kc_dim_product select kcid,kcname,price,issale from chongdianleme.ods_kc_dim_product_tab;

#查看課程商品表

select * from chongdianleme.ods_kc_dim_product limit 36;

select * from ods_kc_dim_product where price>2000;

6)join關聯查詢–自然連接

#join關聯查詢可以把多個表以某個字段作爲關聯,同時獲得多個表的字段數據,關聯不上的數據將會丟棄。

#查詢下在售課程的用戶訪問日誌

select a.userid,a.kcid,b.kcname,b.price,a.time from chongdianleme.ods_kc_fact_clicklog a join chongdianleme.ods_kc_dim_product b on a.kcid=b.kcid where b.issale=1;

7)left join關聯查詢–左連接

#left join關聯查詢和自然連接的區別,左邊的表的沒有關聯上的數據記錄不會丟棄,只是對應的右表那些記錄是空值而已。

#查詢下在售課程的用戶訪問日誌

select a.userid,a.kcid,b.kcname,b.price,a.time,b.kcid from chongdianleme.ods_kc_fact_clicklog a left join chongdianleme.ods_kc_dim_product b on a.kcid=b.kcid where b.kcid is null;

8)full join關聯查詢—完全連接

#full join關聯查詢不管有沒有關聯上,所有的數據記錄都會丟棄,關聯不上只是顯示爲空而已。

#查詢下在售課程的用戶訪問日誌

select a.userid,a.kcid,b.kcname,b.price,a.time,b.kcid from chongdianleme.ods_kc_fact_clicklog a full join chongdianleme.ods_kc_dim_product b on a.kcid=b.kcid;

9)導入關聯表SQL結果到新表

#創建要導入的表數據

create EXTERNAL table IF NOT EXISTS ods_kc_fact_etlclicklog(userid string,kcid string,time string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/ods/kc/fact/ods_kc_fact_etlclicklog/’;

#把查詢集合的結果更新到剛纔創建的表裏ods_kc_fact_etlclicklog,先清空,在導入。如果不想清空而是想追加數據把overwrite關鍵詞去掉就可以了。

insert overwrite table chongdianleme.ods_kc_fact_etlclicklog select a.userid,a.kcid,a.time from chongdianleme.ods_kc_fact_clicklog a join chongdianleme.ods_kc_dim_product b on a.kcid=b.kcid where b.issale=1;

上面的SQL語句都是在Hive客戶端操作的,SQL語句根據數據量和複雜程度不同,快的話如果不觸發MapReduce計算只需要幾毫秒,如果觸發了最快也得幾秒左右。一般情況下執行幾分鐘或幾個小時很正常。對於執行時間長的SQL語句,客戶端的電腦如果斷電或網絡中斷,SQL語句的執行可能也會重點,沒有完全跑完整個SQL。所以這種情況我們可以用一個Shell腳本把需要執行的SQL都放在裏面,以後就可以用nohup後臺的方式去執行這個腳本。

3.通過Shell腳本執行Hive的SQL語句來實現ETL

#創建demohive.sql文件

#把insert overwrite table chongdianleme.ods_kc_fact_etlclicklog select a.userid,a.kcid,a.time from chongdianleme.ods_kc_fact_clicklog a join chongdianleme.ods_kc_dim_product b on a.kcid=b.kcid where b.issale=1;

insert overwrite table chongdianleme.ods_kc_dim_product select kcid,kcname,price,issale from chongdianleme.ods_kc_dim_product_tab;

#加進去,每個SQL語句後面記得加;分號。

#創建demoshell.sh文件

#加入:echo “通過shell腳本執行hive sql語句”

/home/hadoop/software/hadoop2/hive/bin/hive -f /home/hadoop/chongdianleme/demohive.sql;

sh demoshell.sh

#或者

sudo chmod 755 demoshell.sh

./demoshell.sh

#以nohup後臺進程方式執行Shell腳本,防止xshell客戶端由於斷網或者下班後關機或關閉客戶端而導致sql執行半截退出。

#創建nohupdemoshell.sh文件:

#echo “–nohup後臺方式執行腳本,斷網、關機、客戶端關閉無需擔憂執行腳本中斷”;

nohup /home/hadoop/chongdianleme/demoshell.sh >>/home/hadoop/chongdianleme/log.txt 2>&1 &

#然後執行可能報錯:

nohup: 無法運行命令’/home/hadoop/chongdianleme/demoshell.sh’: #權限不夠

#是因爲腳本是不可執行文件。

sudo chmod 755 demoshell.sh

sudo chmod 755 nohupdemoshell.sh

#然後tail -f log.txt就可以看到實時執行日誌。

實際上我們用Hive做ETL數據處理都可以用這種方式,通過Shell腳本來執行Hive SQL,並且是定時觸發,定時觸發有幾種方式,最簡單的方式用Linux系統自帶的crontab調度。但crontab調度不支持複雜的任務依賴。這個時候可以用Azkaban、Oozie來調度。互聯網公司使用最普遍的是Azkaban調度。

4.crontab調度定時執行腳本

這是Linux自帶的本地系統調度工具,簡單好用。通過crontab表達式定時觸發一個shell腳本。

#Crontab調度舉例

crontab -e

16 1,2,23 * * * /home/hadoop/chongdianleme/nohupdemoshell.sh

然後保存,重啓cron服務。

sudo service cron restart

5.Azkaban調度

Azkaban是一套簡單的任務調度服務,整體包括三部分webserver、dbserver、executorserver。Azkaban是linkin的開源項目,開發語言爲Java。Azkaban是由Linkedin開源的一個批量工作流任務調度器。用於在一個工作流內以一個特定的順序運行一組工作和流程。Azkaban定義了一種KV文件格式來建立任務之間的依賴關係,並提供一個易於使用的Web用戶界面維護和跟蹤你的工作流。

Azkaban實際當中經常有這些場景:每天有一個大任務,這個大任務可以分成A,B,C,D四個小任務,A,B任務之間沒有依賴關係,C任務依賴A,B任務的結果,D任務依賴C任務的結果。一般的做法是,開兩個終端同時執行A,B,兩個都執行完了再執行C,最後再執行D。這樣的話,整個的執行過程都需要人工參加,並且得盯着各任務的進度。但是我們的很多任務都是在深更半夜執行的,通過寫腳本設置crontab執行。其實,整個過程類似於一個有向無環圖(DAG)。每個子任務相當於大任務中的一個流,任務的起點可以從沒有度的節點開始執行,任何沒有通路的節點之間可以同時執行,比如上述的A,B。總結起來的話,我們需要的就是一個工作流的調度器,而azkaban就是能解決上述問題的一個調度器。

6.Oozie調度

Oozie是管理Hadoop作業的工作流調度系統,Oozie的工作流是一系列的操作圖,Oozie協調作業是通過時間(頻率)以及有效數據觸發當前的Oozie工作流程,Oozie是針對Hadoop開發的開源工作流引擎,專門針對大規模複雜工作流程和數據管道設計。Oozie圍繞兩個核心:工作流和協調器,前者定義任務的拓撲和執行邏輯,後者負責工作流的依賴和觸發。

這節我們講的Hive常用SQL,Hive SQL能滿足多數應用場景,但有的時候想和自己的業務代碼做混合編程,實現複雜的功能,就需要自定義開發Java函數,也就是我們下面要講的UDF函數。

UDF函數

Hive SQL一般滿足多數應用場景,但是有的時候通過SQL實現比較複雜,用一個函數實現會大大簡化SQL的邏輯,在就是通過自定義函數能夠和業務邏輯結合在一塊,實現更復雜的功能。

1.Hive類型

Hive中有三種UDF:

1) 用戶定義函數(user-defined function)UDF

UDF操作作用於單個數據行,並且產生一個數據行作爲輸出。大多數函數都屬於這一類,比如數學函數和字符串函數。簡單來說UDF返回對應值,一對一。

2) 用戶定義聚集函數(user-defined aggregate function,UDAF)

UDAF 接受多個輸入數據行,併產生一個輸出數據行。像COUNT和MAX這樣的函數就是聚集函數。簡單來說UDAF返回聚類值,多對一。

3)用戶定義表生成函數(user-defined table-generating function,UDTF)

UDTF 操作作用於單個數據行,並且產生多個數據行一個表作爲輸出。簡單來說UDTF返回拆分值,一對多。

實際工作中UDF用的最多,下面我們重點講一下第一種UDF函數,也就是用戶定義函數(user-defined function)UDF,我們統一簡稱爲UDF。

2.UDF自定義函數

Hive的SQL給數據挖掘工作者帶來了很多便利,海量數據通過簡單的SQL就可以完成分析,有時候Hive提供的函數功能滿足不了業務需要,就需要我們自己來寫UDF函數來輔助完成。UDF函數其實就是一個簡單的函數,執行過程就是在Hive轉換成MapReduce程序後,執行Java方法,類似於像MapReduce執行過程中加入一個插件,方便擴展。 UDF只能實現一進一出的操作,如果需要實現多進一出,則需要實現UDAF。Hive可以允許用戶編寫自己定義的函數UDF,來在查詢中使用。我們自定義開發UDF函數的時候繼承org.apache.hadoop.hive.ql.exec.UDF類即可,代碼如下所示:

package com.chongdianleme.hiveudf.udf;

import org.apache.hadoop.hive.ql.exec.UDF;

//自定義類繼承UDF

public class HiveUDFTest extends UDF {

//字符串統一轉大寫字符串示例

public String evaluate (String str){

if(str==null || str.toString().isEmpty()){

return new String();

}

return new String(str.trim().toUpperCase());

}

}

下面看下怎麼部署,部署也分臨時部署和永久生效部署方式,我們分別來看下。

3.臨時部署測試

部署腳本代碼如下所示:

#把程序打包放到目標機器上去;

#進入hive客戶端,添加jar包:

hive>add jar /home/hadoop/software/task/HiveUDFTest.jar;

#創建臨時函數:

hive>CREATE TEMPORARY FUNCTION ups AS ‘hive.HiveUDFTest’;

add jar /home/hadoop/software/task/udfTest.jar;

create temporary function row_toUpper as ‘com.chongdianleme.hiveudf.udf.HiveUDFTest’;

4.永久全局方式部署

線上永久配置方式,部署腳本代碼如下所示:

cd /home/hadoop/software/hadoop2/hive

#創建auxlib文件夾

cd auxlib

#在/home/hadoop/software/hadoop2/hive/auxlib上傳udf函數的jar包。hive sql執行時會自動掃描/data/software/hadoop/hive/auxlib下的jar包。

cd /home/hadoop/software/hadoop2/hive/bin

#顯示隱藏文件

ls -a

#編輯vi .hiverc文件加入

create temporary function row_toUpper as ‘com.chongdianleme.hiveudf.udf.HiveUDFTest’;

之後通過輸入hive命令登錄客戶端就可以了,客戶端會自動掃描加載所有的UDF函數。以上我們講的Hive常用SQL和UDF,以及怎麼用Shell腳本觸發執行SQL,怎麼去做定時的調度。實際工作中,並不是盲目隨意的去建表,一般都會制定一個規範,大家遵守這個規則去執行。這個規範就是我們下面要講的數據倉庫規範和模型設計。

Hive 數據倉庫模型設計

數據倉庫模型設計就是要制定一個規範,這個規範一般是做數據倉庫的分層設計。我們要搭建數據倉庫,把握好數據質量,對數據進行清洗、轉換。那麼更好區分那個是原始數據,那個是清洗後的數據,我們最好做一個數據分層,方便我們快速的找到想要的數據。另外,有些高頻的數據不需要每次都重複計算,只需要計算一次放在一箇中間層裏,供其他業務模塊複用,這樣節省時間,同時也減少的服務器資源的消耗。數據倉庫分層設計還有其他很多好處,下面舉一個實例看看如何分層。

數據倉庫,英文名稱爲Data Warehouse,可簡寫爲DW或DWH。數據倉庫,是爲企業所有級別的決策制定過程,提供所有類型數據支持的戰略集合。它是單個數據存儲,出於分析性報告和決策支持目的而創建。 爲需要業務智能的企業,提供指導業務流程改進、監視時間、成本、質量以及控制。

我們在看下什麼是數據集市,數據集市(Data Mart) ,也叫數據市場,數據集市就是滿足特定的部門或者用戶的需求,按照多維的方式進行存儲,包括定義維度、需要計算的指標、維度的層次等,生成面向決策分析需求的數據立方體。從範圍上來說,數據是從企業範圍的數據庫、數據倉庫,或者是更加專業的數據倉庫中抽取出來的。數據中心的重點就在於它迎合了專業用戶羣體的特殊需求,在分析、內容、表現,以及易用方面。數據中心的用戶希望數據是由他們熟悉的術語表現的。

上面我們說的是數據倉庫和數據集市的概念,簡單來說,在Hadoop平臺上的整個Hive的所有表構成了數據倉庫,這些表有時分層設計的,我們可以分爲四層,ods層、mid層、tp臨時層、數據集市層。其中數據集市可以看做數據倉庫的一個子集,一個數據集市往往是針對一個項目的,比如推薦的叫推薦集市,做用戶畫像的項目叫用戶畫像集市。ods是基礎數據層,也是原始數據層,是最底層的,數據集市是偏最上游的數據層。數據集市的數據可以直接讓項目使用,不用再更多的去加工了。

數據倉庫的分層體現在Hive數據表名上,Hive存儲對應的HDFS目錄最好和表名一致,這樣根據表名也能快速的找到目錄,當然這不是必須的。一般大數據平臺都會創建一個數據字典平臺,在Web的界面上能夠根據表名找到對應的表解釋,比如表的用途,字段表結構,每個字段代表什麼意思,存儲目錄等。而且能查詢到表和表之間的血緣關係。說到血緣關係在數據倉庫裏經常會提起。我在下面會單獨講一小節。下面我用實例講下推薦的數據倉庫。

首先我們需要和部門所有的人制定一個建表規範,大家統一遵守這個規則:

1.建表規範

以下建表規範僅供參考,可以根據每個公司的實際情況來定:

1) 統一創建外部表

外部表的好處是當你不小心刪除了這個表,但數據還會保留下來,如果是誤刪除,會很快的找回來,只需要把建表語句在創建一遍即可。

2)統一分四級,以下劃線分割

分爲幾個級別沒有明確的規定,一般分爲四級的情況比較多。

3)列之間分隔符統一’\001’

用\001分割的目標是爲了避免因爲數據也存在同樣的分隔符造成列的錯亂問題。因爲\001分割符是用戶無法輸入的,之前用的\t分隔符容易被用戶輸入,數據行裏如果存在\t分隔符,會和Hive表裏的\t分隔符混淆,這樣這一行數據會多出幾列,造成列錯亂。

4)location指定目錄統一以/結尾

指定目錄統一以/結尾代表最後是一個文件夾,而不是一個文件。一個文件夾下面可以有很多文件,如果數據特別大,適合拆分成多個小文件。

5)stored類型統一textfile

每個公司實際情況不太一樣,textfile是文本文件類型,好處是方便查看內容,不好的地方是佔用空間較多。

6)表名和location指定目錄保持一致

表名和location指定目錄保持一致的主要目的是方便看見表名就馬上知道對應的數據存儲目錄在哪裏,方便檢索和查找。

#下面列舉一個建表的例子給大家做一個演示

create EXTERNAL table IF NOT EXISTS ods_kc_dim_product(kcid string,kcname string,price float ,issale string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/ods/kc/dim/ods_kc_dim_product/’;

2.數據倉庫分層設計規範

上面我們建表的時候已經說了分爲四級,也就是說我們的數據倉庫分爲四層,也就是操作數據存儲原始數據層ODS、middle中間層、tp臨時層、數據集市層等,下面我們一一講解。

1)ODS層

說明:操作數據存儲ODS(Operational Data Store)用來存放原始基礎數據,比如維表、事實表。以下劃線分爲四級,

(1)原始數據層

(2)項目名稱(kc代表視頻課程類項目,Read代表閱讀類文章)

(3)表類型(dim維度表fact事實表)

(4)表名

舉幾個例子:

#原始數據_視頻課程_事實表_課程訪問日誌表

create EXTERNAL table IF NOT EXISTS ods_kc_fact_clicklog(userid string,kcid string,time string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/ods/kc/fact/ods_kc_fact_clicklog/’;

#ods層維表課程基本信息表:

create EXTERNAL table IF NOT EXISTS ods_kc_dim_product(kcid string,kcname string,price float ,issale string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/ods/kc/dim/ods_kc_dim_product/’;

這裏涉及到一個概念,什麼是維表、事實表?

事實表:

在多維數據倉庫中,保存度量值的詳細值或事實的表稱爲“事實表”。事實數據表通常包含大量的行。事實數據表的主要特點是包含數字數據(事實),並且這些數字信息可以彙總,以提供有關單位作爲歷史的數據,每個事實數據表包含一個由多個部分組成的索引,該索引包含作爲外鍵的相關性緯度表的主鍵,而維度表包含事實記錄的特性。事實數據表不應該包含描述性的信息,也不應該包含除數字度量字段及使事實與緯度表中對應項的相關索引字段之外的任何數據。

維度表:

維度表可以看作是用戶來分析數據的窗口,緯度表中包含事實數據表中事實記錄的特性,有些特性提供描述性信息,有些特性指定如何彙總事實數據表數據,以便爲分析者提供有用的信息,維度表包含幫助彙總數據的特性的層次結構。例如,包含產品信息的維度表通常包含將產品分爲食品、飲料、非消費品等若干類的層次結構,這些產品中的每一類進一步多次細分,直到各產品達到最低級別。在維度表中,每個表都包含獨立於其他維度表的事實特性,例如,客戶維度表包含有關客戶的數據。維度表中的列字段可以將信息分爲不同層次的結構級。維度表包含了維度的每個成員的特定名稱。維度成員的名稱稱爲“屬性”(Attribute)。

在我們的推薦場景,比如這個課程訪問日誌表ods_kc_fact_clicklog,都是用戶訪問課程的大量日誌,針對每條記錄也沒有一個實際意義的主鍵,同一個用戶有多條課程訪問記錄,同一個課程也會別多個用戶訪問,這個表就是事實表。課程基本信息表ods_kc_dim_product,每個課程都有一個唯一的課程主鍵,課程具有唯一性。每個課程都有基本屬性。這個表就是維表。

2)mid層

說明:middle中間層,從ods層中join多表或某一段時間內的小表計算生成的中間表,再後續的集市層中頻繁使用。用來一次生成多次使用,避免每次關聯多個表重複計算。

從ODS層提取數據到集市層常用SQL方式:

#把某個select的查詢結果集覆蓋到某個表,相當於truncate和insert的操作。

insert overwrite table chongdianleme.ods_kc_fact_etlclicklog select a.userid,a.kcid,a.time from chongdianleme.ods_kc_fact_clicklog a join chongdianleme.ods_kc_dim_product b on a.kcid=b.kcid where b.issale=1;

3)tp臨時層

說明:temp臨時層簡稱tp,臨時生成的數據統一放在這層。系統默認有一個/tmp目錄,不要放在這裏目錄,這個目錄很多是Hive本身自己存放在的臨時層,我們不要跟它混在一起

#建表舉例:

create EXTERNAL table IF NOT EXISTS tp_kc_fact_clicklogtotemp(userid string,kcid string,time string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/tp/kc/fact/tp_kc_fact_clicklogtotemp/’;

4)數據集市層

比如,用戶畫像集市,推薦集市,搜索集市等。說明:存放搜索項目數據,集市數據一般是中間層和ods層關聯表計算,或使用Spark程序處理開發算出來的數據。

#用戶畫像集市建表舉例:

create EXTERNAL table IF NOT EXISTS personas_kc_fact_userlog(userid string,kcid string,name string,age string,sex string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/personas/kc/fact/personas_kc_fact_userlog/’;

從開發人員的角色,是有專門的數據倉庫工程師來負責,當然如果預算有限,也可以有大數據ETL工程師來負責。

Hive非常適合離線的數據處理分析,但有些場景需要對數據做實時處理,而Hbase數據庫特別適合處理實時數據。

總結

除了Hive數據倉庫實戰,其它深度學習框架也有不錯的開源實現,比如MXNet,後面請大家關注充電了麼app,課程,微信羣,更多內容請看新書《分佈式機器學習實戰(人工智能科學與技術叢書)》

【新書介紹】
《分佈式機器學習實戰》(人工智能科學與技術叢書)【陳敬雷編著】【清華大學出版社】
新書特色:深入淺出,逐步講解分佈式機器學習的框架及應用配套個性化推薦算法系統、人臉識別、對話機器人等實戰項目

【新書介紹視頻】
分佈式機器學習實戰(人工智能科學與技術叢書)新書【陳敬雷】

視頻特色:重點對新書進行介紹,最新前沿技術熱點剖析,技術職業規劃建議!聽完此課你對人工智能領域將有一個嶄新的技術視野!職業發展也將有更加清晰的認識!

【精品課程】
《分佈式機器學習實戰》大數據人工智能AI專家級精品課程

【免費體驗視頻】:

人工智能百萬年薪成長路線/從Python到最新熱點技術

從Python編程零基礎小白入門到人工智能高級實戰系列課

視頻特色: 本系列專家級精品課有對應的配套書籍《分佈式機器學習實戰》,精品課和書籍可以互補式學習,彼此相互補充,大大提高了學習效率。本系列課和書籍是以分佈式機器學習爲主線,並對其依賴的大數據技術做了詳細介紹,之後對目前主流的分佈式機器學習框架和算法進行重點講解,本系列課和書籍側重實戰,最後講幾個工業級的系統實戰項目給大家。 課程核心內容有互聯網公司大數據和人工智能那些事、大數據算法系統架構、大數據基礎、Python編程、Java編程、Scala編程、Docker容器、Mahout分佈式機器學習平臺、Spark分佈式機器學習平臺、分佈式深度學習框架和神經網絡算法、自然語言處理算法、工業級完整系統實戰(推薦算法系統實戰、人臉識別實戰、對話機器人實戰)、就業/面試技巧/職業生涯規劃/職業晉升指導等內容。

【充電了麼公司介紹】

充電了麼App是專注上班族職業培訓充電學習的在線教育平臺。

專注工作職業技能提升和學習,提高工作效率,帶來經濟效益!今天你充電了麼?

充電了麼官網
http://www.chongdianleme.com/

充電了麼App官網下載地址
https://a.app.qq.com/o/simple.jsp?pkgname=com.charged.app

功能特色如下:

【全行業職位】 - 專注職場上班族職業技能提升

覆蓋所有行業和職位,不管你是上班族,高管,還是創業都有你要學習的視頻和文章。其中大數據智能AI、區塊鏈、深度學習是互聯網一線工業級的實戰經驗。

除了專業技能學習,還有通用職場技能,比如企業管理、股權激勵和設計、職業生涯規劃、社交禮儀、溝通技巧、演講技巧、開會技巧、發郵件技巧、工作壓力如何放鬆、人脈關係等等,全方位提高你的專業水平和整體素質。

【牛人課堂】 - 學習牛人的工作經驗

1.智能個性化引擎:

海量視頻課程,覆蓋所有行業、所有職位,通過不同行業職位的技能詞偏好挖掘分析,智能匹配你目前職位最感興趣的技能學習課程。

2.聽課全網搜索

輸入關鍵詞搜索海量視頻課程,應有盡有,總有適合你的課程。

3.聽課播放詳情

視頻播放詳情,除了播放當前視頻,更有相關視頻課程和文章閱讀,對某個技能知識點強化,讓你輕鬆成爲某個領域的資深專家。

【精品閱讀】 - 技能文章興趣閱讀

1.個性化閱讀引擎:

千萬級文章閱讀,覆蓋所有行業、所有職位,通過不同行業職位的技能詞偏好挖掘分析,智能匹配你目前職位最感興趣的技能學習文章。

2.閱讀全網搜索

輸入關鍵詞搜索海量文章閱讀,應有盡有,總有你感興趣的技能學習文章。

【機器人老師】 - 個人提升趣味學習

基於搜索引擎和智能深度學習訓練,爲您打造更懂你的機器人老師,用自然語言和機器人老師聊天學習,寓教於樂,高效學習,快樂人生。

【精短課程】 - 高效學習知識

海量精短牛人課程,滿足你的時間碎片化學習,快速提高某個技能知識點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章