成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

大數(shù)據(jù)開發(fā)之路:hive篇,你看了嗎?

大數(shù)據(jù)
大數(shù)據(jù)開發(fā)之路漫漫其修遠(yuǎn)兮,吾將上下而求索。很多入門大數(shù)據(jù)的小伙伴,可能接觸到的,就是一只可愛的“小象”,也就是我們的大數(shù)據(jù)領(lǐng)域的數(shù)據(jù)倉庫工具h(yuǎn)ive。

引語

大數(shù)據(jù)開發(fā)之路漫漫其修遠(yuǎn)兮,吾將上下而求索。很多入門大數(shù)據(jù)的小伙伴,可能接觸到的,就是一只可愛的“小象”,也就是我們的大數(shù)據(jù)領(lǐng)域的數(shù)據(jù)倉庫工具h(yuǎn)ive。

這只小象給我們提供了方便類SQL查詢語言HQL來操縱數(shù)據(jù),使得我們一開始不用編寫復(fù)雜的代碼,就可以輕松的探索數(shù)據(jù)。Hive對(duì)于熟悉傳統(tǒng)數(shù)據(jù)庫的同學(xué)來說,算是很友好的一個(gè)入門工具。

原理

在大數(shù)據(jù)生態(tài)中,hive一般作為數(shù)據(jù)倉庫來使用。什么是數(shù)據(jù)倉庫呢? 簡單來說就像一個(gè)大糧倉,里邊堆著各種各樣的糧食,比如小麥、玉米、土豆、大米等等。數(shù)據(jù)倉庫里是一個(gè)數(shù)據(jù)集合體,把不同數(shù)據(jù)源按照一定的形式集合統(tǒng)一起來。 Hive本身是不做數(shù)據(jù)存儲(chǔ)的,它是構(gòu)建在分布式存儲(chǔ)系統(tǒng)HDFS之上,我們平??吹降谋頂?shù)據(jù)其實(shí)本質(zhì)上來說還是HDFS的文件。 Hive把這些HDFS數(shù)據(jù)文件,通過元數(shù)據(jù)規(guī)則映射為數(shù)據(jù)庫的表,并且可以提供SQL操作的功能。 Hive總體結(jié)構(gòu)比較簡單,下方是整體的hive架構(gòu)圖,我們可以看到,總體有三個(gè)組件:用戶接口、元數(shù)據(jù)系統(tǒng)、驅(qū)動(dòng)器。

大數(shù)據(jù)開發(fā)之路:hive篇,你看了嗎?

用戶通過用戶接口來輸入操作指令。一般接口有三種形式:

  • CLI端:一般在linux服務(wù)器直接輸入hive即可進(jìn)入;
  • WEB模式:通過命令bin/hive --service hwi啟動(dòng),默認(rèn)訪問9999端口;
  • 遠(yuǎn)程模式:一般是JDBC之類的編程接口;

Hive的核心在于驅(qū)動(dòng)器,一般驅(qū)動(dòng)器接收到用戶接口傳遞的一條SQL之后,會(huì)進(jìn)行下面的一系列操作:

  • 驅(qū)動(dòng)器開始進(jìn)行語法和語義分析
  • 生成邏輯計(jì)劃并且邏輯優(yōu)化
  • 生成物理計(jì)劃
  • 發(fā)送計(jì)劃到執(zhí)行引擎(常用引擎有mapredue和sprk)執(zhí)行

結(jié)果返回

而元數(shù)據(jù)系統(tǒng)一般傳統(tǒng)數(shù)據(jù)庫來承載,主要記錄了包括hive表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等。

常用hive語法

了解了hive的基礎(chǔ)原理之后呢,我們這里結(jié)合工作中一些需求,來介紹下開發(fā)同學(xué)常用的hive操作。

分組統(tǒng)計(jì)

作為一名SQL仔,經(jīng)常會(huì)要去統(tǒng)計(jì)一些奇奇怪怪的指標(biāo),比如不同年齡段的UV,下單數(shù)的小時(shí)分布之類的。一般常用的分組就是group by了,然后配合上一些窗口函數(shù), SUM、AVG、MIN、MAX、COUNT等,就可以實(shí)現(xiàn)我們很多統(tǒng)計(jì)需求了。比如下邊的統(tǒng)計(jì)時(shí)間段的獨(dú)立用戶數(shù),查詢結(jié)果如下圖所示:

大數(shù)據(jù)開發(fā)之路:hive篇,你看了嗎?

關(guān)聯(lián)查詢

有時(shí)候我們查詢的數(shù)據(jù)存放在不同的表中,那關(guān)聯(lián)查詢就派上用場了。所謂關(guān)聯(lián)查詢,一般就是通過兩張表相同的字段值關(guān)聯(lián)起來,同時(shí)查詢兩張表的記錄。Hive中常用關(guān)聯(lián)分內(nèi)外關(guān)聯(lián)。

我們先建立兩張簡單的表tab_a和tab_b,用實(shí)例來說明關(guān)聯(lián)機(jī)制。表結(jié)構(gòu)和表數(shù)據(jù)如下圖所示:

大數(shù)據(jù)開發(fā)之路:hive篇,你看了嗎?

內(nèi)關(guān)聯(lián)一般使用 關(guān)鍵字Join或inner join ,內(nèi)關(guān)聯(lián)只返回關(guān)聯(lián)上的結(jié)果。

外關(guān)聯(lián)的形式就比較多樣化了,又分為:

  • 左外關(guān)聯(lián):關(guān)鍵字為left [outer] join,以前邊的表為主表,返回記錄數(shù)和主表記錄一致,關(guān)聯(lián)不上的字段為null;
  • 右外關(guān)聯(lián):關(guān)鍵字為right [outer] join,和左外關(guān)聯(lián)相反,則是以后邊的表為主表。
  • 全外關(guān)聯(lián):full [outer] join,返回兩個(gè)表的去重之和,關(guān)聯(lián)不上的字段為null。

行列轉(zhuǎn)換

有時(shí)候我們會(huì)遇到這樣的需求,需要把多列的數(shù)據(jù)平鋪到一行上輸出。比如查詢用戶的訪問軌跡,這時(shí)候有兩個(gè)函數(shù)就起上作用了。還是讓我們先來看看效果。

大數(shù)據(jù)開發(fā)之路:hive篇,你看了嗎?

這兩個(gè)sql的作用都是把每個(gè)用戶的點(diǎn)擊軌跡拼接暫展示出來,其中collect_set和collect_set能夠把列數(shù)據(jù)合并,轉(zhuǎn)為一行。而兩個(gè)的區(qū)別就是collect_set會(huì)進(jìn)行去重。

上述講的是行轉(zhuǎn)列,還有些需求,希望我們能把列數(shù)據(jù)拆分成多行,比如數(shù)據(jù)結(jié)構(gòu)如下,

Page_id StringAd_id Array

  • A[1,2,3]
  • B[3,5,6]
  • C[2,4,5]

要統(tǒng)計(jì)每個(gè)廣告在所有頁面出現(xiàn)的次數(shù),這時(shí)候,我們可以先把同一列的數(shù)據(jù)線拆成多行,hive提供了explode展開函數(shù),具體效果如下圖:

大數(shù)據(jù)開發(fā)之路:hive篇,你看了嗎?

Explode一般配合lateral view使用,把字段內(nèi)容鋪開成虛擬視圖。接下來我們?cè)龠@個(gè)基礎(chǔ)之上,就可以使用統(tǒng)計(jì)函數(shù)來進(jìn)行分析。

大數(shù)據(jù)開發(fā)之路:hive篇,你看了嗎?

取TopN記錄

給數(shù)據(jù)分組排序再取前幾條記錄,也是我們較為常見的需求。hive提供了row_number函數(shù),可以對(duì)排序值進(jìn)行編號(hào)。舉個(gè)栗子,要取省份的溫度較高的城市,數(shù)據(jù)如下:

  • 省份城市溫度
  • 廣東佛山34
  • 廣東廣州30
  • 江西贛州31
  • 江西南昌28
  • 江西萍鄉(xiāng)29
  • 湖南長沙26
  • 湖南衡陽25

我們可以使用row_number()組合group by的形式,來進(jìn)行組內(nèi)排序,并且返回順序值rank。

結(jié)果如下圖所示:

大數(shù)據(jù)開發(fā)之路:hive篇,你看了嗎?

此時(shí),如果要去top1的數(shù)據(jù),只需添加rank為1的條件即可。和row_number功能和用法類似的函數(shù)還有rank()和dense_rank(),區(qū)別在返回的排序rank值有細(xì)微區(qū)別,此處不再贅述。

Hive進(jìn)階

數(shù)據(jù)傾斜

在我們數(shù)據(jù)清洗過程中,經(jīng)常會(huì)出現(xiàn)一種現(xiàn)象,分布式任務(wù)一般會(huì)分成多個(gè)小任務(wù)task,但是呢,有些task處理的很快,有些task就很慢,有時(shí)候甚至?xí)ㄋ缹?dǎo)致整個(gè)任務(wù)失敗,這種現(xiàn)象就是惡名遠(yuǎn)揚(yáng)的數(shù)據(jù)傾斜。之所以導(dǎo)致數(shù)據(jù)傾斜,大部分是join、去重統(tǒng)計(jì)(count distinct)或者group by操作中的key分布不均勻。拿最常見的hive查詢引擎mapreduce來說,基本就是shuffle階段,有些reduce任務(wù)獲取到的key數(shù)據(jù)量十分多,導(dǎo)致處理很緩慢。

為了避免數(shù)據(jù)傾斜,一般從兩種方向去解決:

1.調(diào)整hive參數(shù)

我們可以設(shè)置hive.map.aggr和hive.groupby.skewindata兩個(gè)參數(shù)為true,此時(shí)hive會(huì)生成兩個(gè)job任務(wù),job先將key進(jìn)行隨機(jī)化處理,第二個(gè)job在進(jìn)行真正的shuffle key。如下流程說明圖:

大數(shù)據(jù)開發(fā)之路:hive篇,你看了嗎?

從上圖可以看出,由于多次在map端聚合,使得最終shuffle時(shí)的數(shù)據(jù)量大大減少,從而減輕了數(shù)據(jù)傾斜的程度。

2.優(yōu)化SQL

使用mapJoin:我們經(jīng)常會(huì)有大小表join的需求,而這也是數(shù)據(jù)傾斜的多發(fā)區(qū)。此時(shí)我們可以使用mapJoin的方式,從而避免shuffle。具體實(shí)現(xiàn)就是把小表在每一個(gè)Map任務(wù)內(nèi)存中保存一份,從而直接在Map就進(jìn)行join操作。沒了reduce過程,自然也避免了數(shù)據(jù)傾斜。在hive0.11版本之前,需要顯示聲明啟動(dòng)該優(yōu)化操作,如下示例SQL所示:Select /+ MAPJOIN(small_tab)/ .key,value FROM small_tab JOIN big_tab ON small_tab.key = big_tab.key 而在hive0.11版本之后,hive能夠自動(dòng)檢測小表,自行進(jìn)行mapJoin優(yōu)化。我們可以通過hive.mapjoin.smalltable.filesize參數(shù)手動(dòng)配置小表的閾值(默認(rèn)值25M)。使用MapJoin有一個(gè)缺點(diǎn)在于內(nèi)存會(huì)浪費(fèi),因?yàn)槊總€(gè)Map端都有一個(gè)副本。所以mapJoin也一般只適合大小表join的情況。

異常值、特殊值手動(dòng)處理:很多時(shí)候造成數(shù)據(jù)傾斜的可能是一些空值或者,字符串導(dǎo)致的。我們可以通過過濾空值或者對(duì)空值做隨機(jī)字符串處理,由此避免空值的影響。

如果是大表和大表的join產(chǎn)生了數(shù)據(jù)傾斜,mapJoin這種方式不太合適,但是在某些場景下,其中一個(gè)大表可以被處理成小表。比如,我們要查詢單日訪客瀏覽記錄,并需要附加用戶信息。這時(shí)候要和用戶大表user_info關(guān)聯(lián),而單日訪客記錄量user_flow也比較大,并不能直接使用mapjoin的方式。但仔細(xì)分析,單日訪客UV其實(shí)并不大,可以先進(jìn)行簡單去重,轉(zhuǎn)換為小表進(jìn)而可以使用mapJoin。

具體SQL如下所示:

  1. select /+mapjoin(x)/ from user_flow a left outer join (select /+mapjoin(c)/d. from ( select distinct user_id from user_flow )c join user_info d on c.user_id = d.user_id) x on a.user_id = b.user_id; 

優(yōu)勢和不足

Hive目前作為業(yè)內(nèi)使用最為廣泛的數(shù)據(jù)倉庫工具,自然有著很多優(yōu)點(diǎn): 高可靠、容錯(cuò)性高、擴(kuò)展性強(qiáng)。

HQL語法和傳統(tǒng)SQL類似,且內(nèi)置大量處理函數(shù)支持的存儲(chǔ)格式種類多,兼容性強(qiáng)。用戶接口多,支持各種形式的調(diào)用。但是hive也有它自身的一些不足,比如:

OLTP支持不足,不支持事務(wù),目前只有比較新的版本才可以實(shí)現(xiàn)行列級(jí)別更新且對(duì)格式要求嚴(yán)格。

由于HDFS特性數(shù)據(jù)處理延遲高效率較低。HQL的表達(dá)能力和靈活性方面有限?;谶@些優(yōu)缺點(diǎn),hive有它自身擅長的領(lǐng)域,比如用作離線數(shù)據(jù)倉庫,批量處理海量數(shù)據(jù)。如果要追求實(shí)時(shí)性或者要高效率處理小量數(shù)據(jù),目前來看,其他新的技術(shù)方案,比如kudu、hbase等或許是更好的選擇。

 

責(zé)任編輯:未麗燕 來源: 阿里云棲社區(qū)
相關(guān)推薦

2021-03-19 07:59:33

紅黑樹面試數(shù)據(jù)

2016-10-13 19:31:56

大數(shù)據(jù)應(yīng)用大數(shù)據(jù)

2024-07-11 08:29:57

大數(shù)據(jù).NET工具

2013-01-28 16:51:45

2023-01-08 13:12:57

論文

2017-01-18 10:46:59

騰訊

2015-06-24 16:03:24

大數(shù)據(jù).SAS

2021-04-15 09:37:05

大數(shù)據(jù)Maven

2014-02-12 09:22:28

大數(shù)據(jù)

2011-07-08 10:18:09

海量數(shù)據(jù)數(shù)據(jù)挖掘

2019-03-10 16:21:05

大數(shù)據(jù)深度學(xué)習(xí)人工智能

2014-10-11 11:23:30

2013-08-02 09:56:59

大數(shù)據(jù)

2017-01-23 20:04:29

2009-05-25 10:18:29

PHPLAMPGLAMMP

2021-10-31 20:07:49

Windows驅(qū)動(dòng)開發(fā)

2022-03-14 22:51:25

大數(shù)據(jù)IT企業(yè)

2017-02-05 18:36:36

大數(shù)據(jù)Docker容器

2012-07-25 09:28:10

大數(shù)據(jù)

2011-11-30 17:05:22

數(shù)據(jù)技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩1区2区 | 成人午夜免费网站 | 国产精品久久久久久久久久久新郎 | 高清亚洲 | 精品一二三区 | 成人在线一区二区三区 | 亚洲精品久久久蜜桃 | 国产精品高潮呻吟久久 | 国产 欧美 日韩 一区 | 欧美一区二区三区在线 | 中文在线а√在线8 | 91精品国产综合久久婷婷香蕉 | www午夜视频| 午夜寂寞网站 | 久久天天躁狠狠躁夜夜躁2014 | 成人综合视频在线观看 | 亚洲最大的成人网 | 米奇成人网 | 亚洲国产精久久久久久久 | 日韩欧美综合 | 欧美日韩大片 | 久久综合影院 | 日韩中文字幕在线视频 | 久国久产久精永久网页 | 免费激情av | 国产成人精品一区二区三区视频 | 中文字幕av高清 | 久久久久国产精品一区 | 91精品国产乱码久久蜜臀 | 欧美中文字幕在线 | 色综合色综合 | 一本一道久久a久久精品蜜桃 | 少妇精品亚洲一区二区成人 | 久久ww| 中文字幕 在线观看 | 视频一区二区在线观看 | 成人深夜福利网站 | 亚洲高清免费 | 久久精品国产亚洲一区二区三区 | 一区在线免费视频 | 日韩精品在线播放 |