99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁職業(yè)發(fā)展當(dāng)你學(xué)會抄菜的時候,你就學(xué)會了大數(shù)據(jù)
當(dāng)你學(xué)會抄菜的時候,你就學(xué)會了大數(shù)據(jù)
2017-11-03
收藏

當(dāng)你學(xué)會抄菜的時候,你就學(xué)會了大數(shù)據(jù)

最近在學(xué)習(xí)數(shù)倉跟BI,突然發(fā)現(xiàn),結(jié)合自己所學(xué)會抄的菜。試著把學(xué)過的大數(shù)據(jù)重新理解一番,希望各位都能來一起討論,共同進(jìn)步。
走進(jìn)廚房
  走進(jìn)廚房后,相信大家會看到各種鍋碗瓢盆,案板,切菜刀,調(diào)料,櫥柜,水池...........而這些就相當(dāng)于是大數(shù)據(jù)的架構(gòu)。
  其中櫥柜,相當(dāng)于是Hadoop。櫥柜可以儲存各種食材,而Hadoop可以存儲各種不同類的數(shù)據(jù)(結(jié)構(gòu)化與非結(jié)構(gòu)化)。而櫥柜可以存放不同食材,比如不規(guī)整的豆腐塊,大冬瓜,土豆....還有一些規(guī)整的食材,比如大米,小米,綠豆........規(guī)整的食材與不規(guī)整的食材的區(qū)別,各家有各家不同的規(guī)定,而一般的規(guī)定就是規(guī)格的食材要用袋子把它們裝起來。這里就相當(dāng)于是大數(shù)據(jù)里的數(shù)據(jù)整理流程。而這些半規(guī)整的食材要放到一個個小袋子里,比如說,淀粉,姜粉,蒜泥.....用袋子或者盒子把它們裝好,放在相應(yīng)櫥柜的地方,就相當(dāng)于我們大數(shù)據(jù)里說的ETL(抽取,封裝,加載),以備后用。
  而不同廠家的櫥柜又會有不同的格子劃分及存儲區(qū),比如:歐派,宜家的櫥柜就會劃分出很多小的分區(qū)來裝不同的東西。而這一塊就相當(dāng)于HBase,灶臺下邊有專門用于涼碗的,還有抽油煙機(jī)旁邊專門用于放刀具的區(qū)域,還有專門用于放各種鍋的區(qū)域。而當(dāng)HBase劃分的好的時候,就對上層的MapReduce有很大的幫助,因?yàn)槟愀鱾€區(qū)域規(guī)劃的越好,當(dāng)你開始抄菜的時候,取用各種餐具的時候就會更加的得心用手。
  至于上邊的Mahout,Pig,Hive就相當(dāng)于你如何在櫥柜中找到你相應(yīng)的食材的過程,比如說,你要抄西紅柿雞蛋,你要找雞蛋跟西紅柿...........再往上走就是一個對廚房的整體管理了。你做過的哪些菜,或者你想按照某個食譜來做菜,你就要有一個本子寫上你每次做菜的步驟,這個就相當(dāng)于是FlumeL,而Sqoop就相當(dāng)于蘿卜擦,你想吃蘿卜絲,你就要用工具把蘿卜切成絲才可以,這里,用刀具可以,用蘿卜擦?xí)咝А?br />   再來說說Zookeeper吧!它就相當(dāng)于把你經(jīng)常用的幾項(xiàng)工具放到離你做菜最近的一個櫥柜中。方便管理這些工具。
  好了,說完了Hadoop,再來說一說Spark.它跟櫥柜的唯一不同就是:櫥柜是給你全部安裝固定好了的,而Spark這種櫥柜是可以移動的櫥柜,同時對于你經(jīng)常用的工具,可以進(jìn)行優(yōu)先排序。讓你更快的對食材進(jìn)行加工。剛開始,你做完一道菜,要半個小時多,而當(dāng)你熟練之后,加之Spark移動櫥柜+優(yōu)先推送食材(內(nèi)存計算+可迭代算法),你可以在5分鐘內(nèi)就做完這道菜。
加工食材
  實(shí)際上,我們食材的儲存過程就相當(dāng)于是一個數(shù)倉的建立過程,而在一個數(shù)倉的建立過程中。最重要的莫過于區(qū)分不同維度。比如在大數(shù)據(jù)里的Key+Value,Big list,實(shí)際上都是提供一種基于可擴(kuò)展的列值存儲。而在數(shù)據(jù)可視化中,數(shù)據(jù)多維分維里,也是強(qiáng)調(diào)數(shù)據(jù)的不同維度的區(qū)分。這里我們就以食材的區(qū)分為例來說明。
  首先,廚房里的食材維度可以大致分析:蔬菜維度,禽肉維度,米面維度............不同的維度決定了你對食物的理解程度,比如:你可以把糯米放在米面維度,也可以放在糕點(diǎn)維度。所以數(shù)據(jù)的不同維度也取決于你對食材的功能及使用場景。再比如:把你香茹切的很小,曬干,然后碾成粉,要這些香茹粉就會從蔬菜維度進(jìn)入到調(diào)料維度。
  當(dāng)我們明白了食材維度的這個概念之后,我們就要開始我們的加工了。是先抄,還是先炸,還是先熱水湯一下,都是對食材的一種加工。這里就相當(dāng)于對初始數(shù)據(jù)進(jìn)行相應(yīng)的整形。由于要用到不同的廚具,就涉及到前邊講的走進(jìn)廚房的細(xì)節(jié)的。在大數(shù)據(jù)里,可以用不同的組件對原始數(shù)據(jù)進(jìn)行處理。而在廚房,可以用不同的廚具對食材進(jìn)行處理。比如:蒸饅頭,可以用抄鍋來蒸,同時可以用鋼精鍋來蒸。雖然都能達(dá)到能吃的地步。但是所用的時間及口感不同。這些也就相當(dāng)于大數(shù)據(jù)里各種不同組件之間的動行效果。
  最后,先感謝下我現(xiàn)在的公司,每個月不定期給我們發(fā)菜,同時也感謝下老婆,教會了我抄各種菜。最后,附一張我抄好的菜吧(先給它起一個響亮的名字:亂棍打死豬八戒!undefined )!

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }