主頁 >  其他 > Hive資料倉庫實戰

Hive資料倉庫實戰

2020-12-06 11:28:07 其他

文章目錄

  • 前言
  • 一、Hive原理和功能介紹
  • 二、Hive安裝部署
  • 三、Hive SQL操作
  • UDF函式
  • 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.閱讀全網搜索

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

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

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

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

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/230668.html

標籤:AI

上一篇:2020-12-05

下一篇:原理決議-過擬合與正則化

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more