一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

【大數(shù)據(jù)微課回顧】楊卓犖:Hive原理及查詢優(yōu)化

 CharlseShan 2016-05-17

Introduction

卓犖

目前在硅谷一家公司工作,也在積極準(zhǔn)備回國發(fā)展。2011年至2014年在阿里研究Hive。


今天,我想和大家簡(jiǎn)單介紹一下Hive原理和查詢優(yōu)化。由于時(shí)間有限,很多內(nèi)容簡(jiǎn)要介紹一下,歡迎私下多交流。



Hive是構(gòu)建在Hadoop上的數(shù)據(jù)倉庫軟件框架,支持使用SQL來讀,寫和管理大規(guī)模數(shù)據(jù)集合。Hive入門非常簡(jiǎn)單,功能非常強(qiáng)大,所以非常流行。


通常來說,Hive只支持?jǐn)?shù)據(jù)查詢和加載,但后面的版本也支持了插入,更新和刪除以及流式api。Hive具有目前Hadoop上最豐富最全的SQL語法,也擁有最慢最穩(wěn)定的執(zhí)行。是目前Hadoop上幾乎標(biāo)準(zhǔn)的ETL和數(shù)據(jù)倉庫工具。


Hive這個(gè)特點(diǎn)與其它AdHoc查詢工具如Impala,Spark SQL或者Presto有著應(yīng)用場(chǎng)景的區(qū)別,也就是雖然都是即席查詢工具,前者適用與穩(wěn)定作業(yè)執(zhí)行,調(diào)度以及ETL,或者更傾向于交戶式。一個(gè)典型的場(chǎng)景是分析師使用Impala去探測(cè)數(shù)據(jù),驗(yàn)證想法,并把數(shù)據(jù)產(chǎn)品部署在Hive上執(zhí)行。


在我們講Hive原理和查詢優(yōu)化前,讓我們先回顧一下Hadoop基本原理。




Hadoop是一個(gè)分布式系統(tǒng),有HDFS和Yarn。HDFS用于執(zhí)行存儲(chǔ),Yarn用于資源調(diào)度和計(jì)算。MapReduce是跑在Yarn上的一種計(jì)算作業(yè),此外還有Spark等。


關(guān)于Hadoop介紹,硅谷的太閣實(shí)驗(yàn)室錄制了一個(gè)視頻。  http://v.youku.com/v_show/id_XMTUxOTA5MjA1Mg==.html  也是我主講的。


Hive通常意義上來說,是把一個(gè)SQL轉(zhuǎn)化成一個(gè)分布式作業(yè),如MapReduce,Spark或者Tez。無論Hive的底層執(zhí)行框架是MapReduce、Spark還是Tez,其原理基本都類似。


而目前,由于MapReduce穩(wěn)定,容錯(cuò)性好,大量數(shù)據(jù)情況下使用磁盤,能處理的數(shù)據(jù)量大,所以目前Hive的主流執(zhí)行框架是MapReduce,但性能相比Spark和Tez也就較低,等下講到Group By和JOIN原理時(shí)會(huì)解釋這方面的原因。


目前的Hive除了支持在MapReduce上執(zhí)行,還支持在Spark和Tez 上執(zhí)行。我們以MapReduce為例來說明的Hive的原理。先回顧一下 MapReduce 原理。




兩個(gè)Mapper各自輸入一塊數(shù)據(jù),由鍵值對(duì)構(gòu)成,對(duì)它進(jìn)行加工(加上了個(gè)字符n),然后按加工后的數(shù)據(jù)的鍵進(jìn)行分組,相同的鍵到相同的機(jī)器。這樣的話,第一臺(tái)機(jī)器分到了鍵nk1和nk3,第二臺(tái)機(jī)器分到了鍵nk2。


接下來再在這些Reducers上執(zhí)行聚合操作(這里執(zhí)行的是是count),輸出就是nk1出現(xiàn)了2次,nk3出現(xiàn)了1次,nk2出現(xiàn)了3次。從全局上來看,MapReduce就是一個(gè)分布式的GroupBy的過程。


從上圖可以看到,Global Shuffle左邊,兩臺(tái)機(jī)器執(zhí)行的是Map。Global Shuffle右邊,兩臺(tái)機(jī)器執(zhí)行的是Reduce。所以Hive,實(shí)際上就是一個(gè)編譯器,一個(gè)翻譯機(jī)。把SQL翻譯成MapReduce之類的作業(yè)。


>>>>

Hive架構(gòu)


圖片來自Hortonworks


下面這個(gè)舊一點(diǎn)的圖片來自Facebook




從架構(gòu)圖上可以很清楚地看出Hive和Hadoop(MapReduce,HDFS)的關(guān)系。


Hive是最上層,即客戶端層或者作業(yè)提交層。 

MapReduce/Yarn是中間層,也就是計(jì)算層。 

HDFS是底層,也就是存儲(chǔ)層。


從Facebook的圖上可以看出,Hive主要有QL,MetaStore和Serde三大核心組件構(gòu)成。QL就是編譯器,也是Hive中最核心的部分。Serde就是Serializer和Deserializer的縮寫,用于序列化和反序列化數(shù)據(jù),即讀寫數(shù)據(jù)。MetaStore對(duì)外暴露Thrift API,用于元數(shù)據(jù)的修改。比如表的增刪改查,分區(qū)的增刪改查,表的屬性的修改,分區(qū)的屬性的修改等。等下我會(huì)簡(jiǎn)單介紹一下核心,QL。


>>>>

Hive的數(shù)據(jù)模型


Hive的數(shù)據(jù)存儲(chǔ)在HDFS上,基本存儲(chǔ)單位是表或者分區(qū),Hive內(nèi)部把表或者分區(qū)稱作SD,即Storage Descriptor。一個(gè)SD通常是一個(gè)HDFS路徑,或者其它文件系統(tǒng)路徑。SD的元數(shù)據(jù)信息存儲(chǔ)在Hive MetaStore中,如文件路徑,文件格式,列,數(shù)據(jù)類型,分隔符。Hive默認(rèn)的分格符有三種,分別是^A、^B和^C,即ASCii碼的1、2和3,分別用于分隔列,分隔列中的數(shù)組元素,和元素Key-Value對(duì)中的Key和Value。


還記得大明湖畔暴露Thrift API的MetaStore么?嗯,是她,就是它!所有的數(shù)據(jù)能不能認(rèn)得出來全靠它!


Hive的核心是Driver,Driver的核心是SemanticAnalyzer。 Hive實(shí)際上是一個(gè)SQL到Hadoop作業(yè)的編譯器。 Hadoop上最流行的作業(yè)就是MapReduce,當(dāng)然還有其它,比如Tez和Spark。Hive目前支持MapReduce, Tez, Spark三種作業(yè),其原理和剛才回顧的MapReduce過程類似,只是在執(zhí)行優(yōu)化上有區(qū)別。


Hive作業(yè)的執(zhí)行過程實(shí)際上是SQL翻譯成作業(yè)的過程?那么,它是怎么翻譯的?




一條SQL,進(jìn)入的Hive。經(jīng)過上述的過程,其實(shí)也是一個(gè)比較典型的編譯過程變成了一個(gè)作業(yè)。




首先,Driver會(huì)輸入一個(gè)字符串SQL,然后經(jīng)過Parser變成AST,這個(gè)變成AST的過程是通過Antlr來完成的,也就是Anltr根據(jù)語法文件來將SQL變成AST。


AST進(jìn)入SemanticAnalyzer(核心)變成QB,也就是所謂的QueryBlock。一個(gè)最簡(jiǎn)的查詢塊,通常來講,一個(gè)From子句會(huì)生成一個(gè)QB。生成QB是一個(gè)遞歸過程,生成的 QB經(jīng)過GenLogicalPlan過程,變成了一個(gè)Operator圖,也是一個(gè)有向無環(huán)圖。


OP DAG經(jīng)過邏輯優(yōu)化器,對(duì)這個(gè)圖上的邊或者結(jié)點(diǎn)進(jìn)行調(diào)整,順序修訂,變成了一個(gè)優(yōu)化后的有向無環(huán)圖。這些優(yōu)化過程可能包括謂詞下推(Predicate Push Down),分區(qū)剪裁(Partition Prunner),關(guān)聯(lián)排序(Join Reorder)等等


經(jīng)過了邏輯優(yōu)化,這個(gè)有向無環(huán)圖還要能夠執(zhí)行。所以有了生成物理執(zhí)行計(jì)劃的過程。GenTasks。Hive的作法通常是碰到需要分發(fā)的地方,切上一刀,生成一道MapReduce作業(yè)。如Group By切一刀,Join切一刀,Distribute By切一刀,Distinct切一刀。


這么很多刀砍下去之后,剛才那個(gè)邏輯執(zhí)行計(jì)劃,也就是那個(gè)邏輯有向無環(huán)圖,就被切成了很多個(gè)子圖,每個(gè)子圖構(gòu)成一個(gè)結(jié)點(diǎn)。這些結(jié)點(diǎn)又連成了一個(gè)執(zhí)行計(jì)劃圖,也就是Task Tree.


把這些個(gè)Task Tree 還可以有一些優(yōu)化,比如基于輸入選擇執(zhí)行路徑,增加備份作業(yè)等。進(jìn)行調(diào)整。這個(gè)優(yōu)化就是由Physical Optimizer來完成的。經(jīng)過Physical Optimizer,這每一個(gè)結(jié)點(diǎn)就是一個(gè)MapReduce作業(yè)或者本地作業(yè),就可以執(zhí)行了。


這就是一個(gè)SQL如何變成MapReduce作業(yè)的過程。要想觀查這個(gè)過程的最終結(jié)果,可以打開Hive,輸入Explain + 語句,就能夠看到。



Hive最重要的部分是Group By和Join。下面分別講解一下:


首先是Group By


例如我們有一條SQL語句:

INSERT INTO TABLE pageid_age_sum 

SELECT pageid, age, count(1) 

FROM pv_users 

GROUP BY pageid, age;




把每個(gè)網(wǎng)頁的閱讀數(shù)按年齡進(jìn)行分組統(tǒng)計(jì)。由于前面介紹了,MapReduce就是一個(gè)Group By的過程,這個(gè)SQL翻譯成MapReduce就是相對(duì)簡(jiǎn)單的。




我們?cè)贛ap端,每一個(gè)Map讀取一部分表的數(shù)據(jù),通常是64M或者256M,然后按需要Group By的Key分發(fā)到Reduce端。經(jīng)過Shuffle Sort,每一個(gè)Key再在Reduce端進(jìn)行聚合(這里是Count),然后就輸出了最終的結(jié)果。值得一提的是,Distinct在實(shí)現(xiàn)原理上與Group By類似。當(dāng)Group By遇上 Distinct……例如:SELECT pageid, COUNT(DISTINCT userid) FROM page_view GROUP BY pageid




Hive 實(shí)現(xiàn)成MapReduce的原理如下:




也就是說Map分發(fā)到Reduce的時(shí)候,會(huì)使用pageid和userid作為聯(lián)合分發(fā)鍵,再去聚合(Count),輸出結(jié)果。


介紹了這么多原理,重點(diǎn)還是為了使用,為了適應(yīng)場(chǎng)景和業(yè)務(wù),為了優(yōu)化。從原理上可以看出,當(dāng)遇到Group By的查詢時(shí),會(huì)按Group By 鍵進(jìn)行分發(fā)?如果鍵很多,撐爆了機(jī)器會(huì)怎么樣?


對(duì)于Impala,或Spark,為了快,key在內(nèi)存中,爆是經(jīng)常的。爆了就失敗了。對(duì)于Hive,Key在硬盤,本身就比Impala, Spark的處理能力大上幾萬倍。但……不幸的是,硬盤也有可能爆。


當(dāng)然,硬盤速度也比內(nèi)存慢上不少,這也是Hive總是被吐槽的原因,場(chǎng)景不同,要明白自己使用的場(chǎng)景。當(dāng)Group By Key大到連硬盤都能撐爆時(shí)……這個(gè)時(shí)候可能就需要優(yōu)化了。


Group By優(yōu)化通常有Map端數(shù)據(jù)聚合和傾斜數(shù)據(jù)分發(fā)兩種方式。Map端部分聚合,配置開關(guān)是hive.map.aggr


也就是執(zhí)行SQL前先執(zhí)行 set hive.map.aggr=true;它的原理是Map端在發(fā)到Reduce端之前先部分聚合一下。來減少數(shù)據(jù)量。因?yàn)槲覀儎偛乓呀?jīng)知道,聚合操作是在Reduce端完成的,只要能有效的減少Reduce端收到的數(shù)據(jù)量,就能有效的優(yōu)化聚合速度,避免爆機(jī),快速拿到結(jié)果。


另外一種方式則是針對(duì)傾斜的key做兩道作業(yè)的聚合。什么是傾斜的數(shù)據(jù)?比如某貓雙11交易,華為賣了1億臺(tái),蘋果賣了10萬臺(tái)。華為就是典型的傾斜數(shù)據(jù)了。如果要統(tǒng)計(jì)華為和蘋果,會(huì)用兩個(gè)Reduce作Group By,一個(gè)處理1億臺(tái),一個(gè)處理10萬臺(tái),那個(gè)1億臺(tái)的就是傾余。


由于按key分發(fā),遇到傾斜數(shù)據(jù)怎么辦?



可以使用hive.groupby.skewindata選項(xiàng),通過兩道MapReduce作業(yè)來處理。當(dāng)選項(xiàng)設(shè)定為 true,生成的查詢計(jì)劃會(huì)有兩個(gè) MR Job。第一個(gè) MR Job 中,Map 的輸出結(jié)果集合會(huì)隨機(jī)分布到Reduce 中,每個(gè) Reduce 做部分聚合操作,并輸出結(jié)果,這樣處理的結(jié)果是相同的 Group By Key有可能被分發(fā)到不同的 Reduce 中,從而達(dá)到負(fù)載均衡的目的;第二個(gè) MR Job 再根據(jù)預(yù)處理的數(shù)據(jù)結(jié)果按照 Group ByKey 分布到 Reduce 中(這個(gè)過程可以保證相同的 Group By Key 被分布到同一個(gè) Reduce中),最后完成最終的聚合操作。 


第一道作業(yè):Map隨機(jī)分發(fā),按gby key部分聚合 

第二道作業(yè):第一道作業(yè)結(jié)果Map傾斜的key分發(fā),按gbk key進(jìn)行最終聚合


無論你使用Map端,或者兩道作業(yè)。其原理都是通過部分聚合來來減少數(shù)據(jù)量。能不能部分聚合,部分聚合能不能有效減少數(shù)據(jù)量,通常與UDAF,也就是聚合函數(shù)有關(guān)。也就是只對(duì)代數(shù)聚合函數(shù)有效,對(duì)整體聚合函數(shù)無效。


所謂代數(shù)聚合函數(shù),就是由部分結(jié)果可以匯總出整體結(jié)果的函數(shù),如count,sum。 所謂整體聚合函數(shù),就是無法由部分結(jié)果匯總出整體結(jié)果的函數(shù),如avg,mean。 比如,sum, count,知道部分結(jié)果可以加和得到最終結(jié)果。 而對(duì)于,mean,avg,知道部分?jǐn)?shù)據(jù)的中位數(shù)或者平均數(shù),是求不出整體數(shù)據(jù)的中位數(shù)和平均數(shù)的。


在遇到復(fù)雜邏輯的時(shí)候,還是要具體問題具體分析,根據(jù)系統(tǒng)的原理,優(yōu)化邏輯。剛才說了,Hive最重要的是Group By和Join,所以下面我們講Join.


>>>>

JOIN

例如這樣一個(gè)查詢:INSERT INTO TABLE pv_users 

SELECT pv.pageid, u.age 

FROM page_view pv JOIN user u ON (pv.userid = u.userid);




把訪問和用戶表進(jìn)行關(guān)聯(lián),生成訪問用戶表。Hive的Join也是通過MapReduce來完成的。




就上面的查詢,在MapReduce的Join的實(shí)現(xiàn)過程如下:




Map端會(huì)分別讀入各個(gè)表的一部分?jǐn)?shù)據(jù),把這部分?jǐn)?shù)據(jù)進(jìn)行打標(biāo),例如pv表標(biāo)1,user表標(biāo)2.


Map讀取是分布式進(jìn)行的。標(biāo)完完后分發(fā)到Reduce端,Reduce 端根據(jù)Join Key,也就是關(guān)聯(lián)鍵進(jìn)行分組。然后按打的標(biāo)進(jìn)行排序,也就是圖上的Shuffle Sort。


在每一個(gè)Reduce分組中,Key為111的在一起,也就是一臺(tái)機(jī)器上。同時(shí),pv表的數(shù)據(jù)在這臺(tái)機(jī)器的上端,user表的數(shù)據(jù)在這臺(tái)機(jī)器的下端。


這時(shí)候,Reduce把pv表的數(shù)據(jù)讀入到內(nèi)存里,然后逐條與硬盤上user表的數(shù)據(jù)做Join就可以了。


從這個(gè)實(shí)現(xiàn)可以看出,我們?cè)趯慔ive Join的時(shí)候,應(yīng)該盡可能把小表(分布均勻的表)寫在左邊,大表(或傾斜表)寫在右邊。這樣可以有效利用內(nèi)存和硬盤的關(guān)系,增強(qiáng)Hive的處理能力。


同時(shí)由于使用Join Key進(jìn)行分發(fā), Hive也只支持等值Join,不支持非等值Join。由于Join和Group By一樣存在分發(fā),所以也同樣存在著傾斜的問題。所以Join也要對(duì)抗傾斜數(shù)據(jù),提升查詢執(zhí)行性能。


通常,有一種執(zhí)行非??斓腏oin叫Map Join 。


>>>>

Map Join 優(yōu)化


手動(dòng)的Map Join SQL如下:

INSERT INTO TABLE pv_users 

SELECT /* MAPJOIN(pv) */ pv.pageid, u.age 

FROM page_view pv JOIN user u 

ON (pv.userid = u.userid);

還是剛才的例子,用Map Join執(zhí)行





Map Join通常只適用于一個(gè)大表和一個(gè)小表做關(guān)聯(lián)的場(chǎng)景,例如事實(shí)表和維表的關(guān)聯(lián)。


原理如上圖,用戶可以手動(dòng)指定哪個(gè)表是小表,然后在客戶端把小表打成一個(gè)哈希表序列化文件的壓縮包,通過分布式緩存均勻分發(fā)到作業(yè)執(zhí)行的每一個(gè)結(jié)點(diǎn)上。然后在結(jié)點(diǎn)上進(jìn)行解壓,在內(nèi)存中完成關(guān)聯(lián)。


Map Join全過程不會(huì)使用Reduce,非常均勻,不會(huì)存在數(shù)據(jù)傾斜問題。默認(rèn)情況下,小表不應(yīng)該超過25M。在實(shí)際使用過程中,手動(dòng)判斷是不是應(yīng)該用Map Join太麻煩了,而且小表可能來自于子查詢的結(jié)果。


Hive有一種稍微復(fù)雜一點(diǎn)的機(jī)制,叫Auto Map Join




還記得原理中提到的物理優(yōu)化器?Physical Optimizer么?它的其中一個(gè)功能就是把Join優(yōu)化成Auto Map Join


圖上左邊是優(yōu)化前的,右邊是優(yōu)化后的


優(yōu)化過程是把Join作業(yè)前面加上一個(gè)條件選擇器ConditionalTask和一個(gè)分支。左邊的分支是MapJoin,右邊的分支是Common Join(Reduce Join)


看看左邊的分支是不是和我們上上一張圖很像?


這個(gè)時(shí)候,我們?cè)趫?zhí)行的時(shí)候,就由這個(gè)Conditional Task 進(jìn)行實(shí)時(shí)路徑選擇,遇到小于25兆走左邊,大于25兆走右邊。所謂,男的走左邊,女的走右邊,人妖走中間。


在比較新版的Hive中,Auto Mapjoin是默認(rèn)開啟的。如果沒有開啟,可以使用一個(gè)開關(guān), set hive.auto.convert.join=true 開啟。

當(dāng)然,Join也會(huì)遇到和上面的Group By一樣的傾斜問題。




Hive 也可以通過像Group By一樣兩道作業(yè)的模式單獨(dú)處理一行或者多行傾斜的數(shù)據(jù)。


>>>>

hive 中設(shè)定 

set hive.optimize.skewjoin = true;  

set hive.skewjoin.key = skew_key_threshold (default = 100000)


其原理是就在Reduce Join過程,把超過十萬條的傾斜鍵的行寫到文件里,回頭再起一道Join單行的Map Join作業(yè)來單獨(dú)收拾它們。最后把結(jié)果取并集就是了。如上圖所示。


Update/Insert/Delete原理


Hive從0.14開始支持ACID。也就是支持了Update Insert Delete及一些流式的API。也就是這個(gè)原因,Hive把0.14.1 Bug Fixes版本改成了 Hive 1.0,也就是認(rèn)為功能基本穩(wěn)定和健全了。


由于HDFS是不支持本地文件更改的,同時(shí)在寫的時(shí)候也不支持讀。

表或者分區(qū)內(nèi)的數(shù)據(jù)作為基礎(chǔ)數(shù)據(jù)。事務(wù)產(chǎn)生的新數(shù)據(jù)如Insert/Update/Flume/Storm等會(huì)存儲(chǔ)在增量文件(Delta Files)中。讀取這個(gè)文件的時(shí)候,通常是Table Scan階段,會(huì)合并更改,使讀出的數(shù)據(jù)一致。


Hive Metastore上面增加了若干個(gè)線程,會(huì)周期性地合并并合并刪除這些增量文件。


具體可以實(shí)現(xiàn)參考這個(gè)網(wǎng)頁。 https://cwiki./confluence/display/Hive/Hive Transactions


>>>>

Hive適合做什么? 

由于多年積累,Hive比較穩(wěn)定,幾乎是Hadoop上事實(shí)的SQL標(biāo)準(zhǔn)。 Hive適合離線ETL,適合大數(shù)據(jù)離線Ad-Hoc查詢。適合特大規(guī)模數(shù)據(jù)集合需要精確結(jié)果的查詢。對(duì)于交互式Ad-Hoc查詢,通常還會(huì)有別的解決方案,比如Impala, Presto等等。


特大規(guī)模的離線數(shù)據(jù)處理,尤其是大表關(guān)聯(lián),特大規(guī)模數(shù)據(jù)聚集,很適合使用Hive。講了這么多原理,最重要的還是應(yīng)用,還是創(chuàng)造價(jià)值。


對(duì)Hive來說,數(shù)據(jù)量再大,都不怕。數(shù)據(jù)傾斜,是大難題。但有很多優(yōu)化方法和業(yè)務(wù)改進(jìn)方法可以避過。Hive執(zhí)行穩(wěn)定,函數(shù)多,擴(kuò)展性強(qiáng),數(shù)據(jù)吞吐量大,了解原理,有助于用好和選型。


我今天要介紹的差不多了,原理部分介紹比較多,使用和擴(kuò)展介紹的比較少,希望有時(shí)間和大家再作交流。下面進(jìn)入問答部分!



Q&A:

01

怎么知道hive作業(yè)產(chǎn)生傾斜了?

根據(jù)原理,傾斜只會(huì)發(fā)生在Reduce 是吧。如果Map傾斜一定是上一個(gè)Reduce傾斜了對(duì)吧。有一個(gè)Reduce死活執(zhí)行不完,就是傾斜對(duì)吧。


02

在實(shí)踐中,如果hive執(zhí)行異常了,在問題分析上可以分享一下經(jīng)驗(yàn)嗎?比如 hive執(zhí)行很慢。

有一個(gè)或幾個(gè)結(jié)點(diǎn)慢,通常是傾斜。大家一起慢,通常是udf或者計(jì)算邏輯或者是GC問題。


03

為什么mapjoin task是多個(gè),common join task是一個(gè),mapjointask與mapjoinlocoltask有什么區(qū)別?

這里畫多個(gè)的意思是,把小表分發(fā)到多個(gè)結(jié)點(diǎn)上,每個(gè)結(jié)點(diǎn)都是這樣。不是多個(gè)。mapjoinlocoltask只做小表序列化,把小表序列化壓縮打包。


04

hdfs是分布式的,那hive是分布式嗎,還是只是在一個(gè)節(jié)點(diǎn)裝上就可以了,所有任務(wù)的接收分發(fā)都通過這個(gè)節(jié)點(diǎn)。

Hive是單機(jī)的,一個(gè)結(jié)點(diǎn)就可以了,通常是兩個(gè),因?yàn)樽詈米孧etastore獨(dú)占一個(gè)。


05

可以分享下學(xué)習(xí)資源嗎?

我主要是讀代碼。感謝阿里曾經(jīng)讓我遇到過各種奇怪的問題,翻遍奇怪的代碼。


06

是不是支持update 后,可以做增量groupby ,比如每天把一個(gè)用戶訪問次數(shù)做了sum后與歷史這個(gè)用戶的訪問次數(shù)做sum?

是的,由MetaStore定期合并,MetaStore內(nèi)部有幾個(gè)線程。


07

怎么找合適的技術(shù)路線,應(yīng)屆生,求指導(dǎo)!

看興趣,憑感覺。


08

mapjoin括號(hào)里面是小表嗎?

是的


09

請(qǐng)問hive支持的sql語法全嗎,用的時(shí)候好多在mysql可以的,hive里就語法錯(cuò)誤?

不太全,還有特殊語法,比如distribute by, sort by,但還算比較全。


10

要是排序數(shù)據(jù)過大,大概要怎么解決。

Hive不推薦使用Order By,推薦使用Distribute By 和 sort by ,也就是分級(jí)分桶排。


11

老師能給講講row_number么?

Hive row_number是 reduce端做的,不是全局的。跟分發(fā)原理有關(guān)。


大數(shù)據(jù)分析挖掘原創(chuàng)作品,歡迎大家瘋狂轉(zhuǎn)發(fā)

大家關(guān)注我們后,可以在文末留言區(qū)繼續(xù)留言提問




    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    精品人妻少妇二区三区| 欧美精品一区二区三区白虎| 国产成人综合亚洲欧美日韩| 国产精品午夜小视频观看| 黄色激情视频中文字幕| 日韩精品一级片免费看| 五月婷日韩中文字幕四虎| 精品视频一区二区不卡| 中文字幕佐山爱一区二区免费| 午夜久久精品福利视频| 亚洲视频在线观看你懂的| 国产熟女一区二区三区四区| 国产免费黄片一区二区| 精品人妻av区波多野结依| 中字幕一区二区三区久久蜜桃| 日韩性生活片免费观看| 一区二区免费视频中文乱码国产 | 国产av熟女一区二区三区四区| 日韩成人动画在线观看| 久久精品视频就在久久| 免费亚洲黄色在线观看| 国产精品国产亚洲看不卡| 二区久久久国产av色| 亚洲妇女作爱一区二区三区| 国产精品一区二区三区黄色片| 成人国产激情在线视频| 国产麻豆精品福利在线| 欧美一级黄片免费视频| 日韩精品中文字幕在线视频| 国产精品推荐在线一区| 国产精品国产亚洲区久久| 午夜传媒视频免费在线观看| 亚洲精品有码中文字幕在线观看| 亚洲中文字幕高清乱码毛片| 中文字幕av诱惑一区二区| 国产欧美日韩精品一区二| 欧美成人一区二区三区在线| 国产精品涩涩成人一区二区三区| 午夜精品国产一区在线观看| 精品综合欧美一区二区三区| 欧美国产精品区一区二区三区|