Hive大數(shù)據(jù)存儲(chǔ)與處理 課件 第7、8章 廣電用戶數(shù)據(jù)清洗及數(shù)據(jù)導(dǎo)出、廣電用戶數(shù)據(jù)存儲(chǔ)與處理的程序開(kāi)發(fā)_第1頁(yè)
Hive大數(shù)據(jù)存儲(chǔ)與處理 課件 第7、8章 廣電用戶數(shù)據(jù)清洗及數(shù)據(jù)導(dǎo)出、廣電用戶數(shù)據(jù)存儲(chǔ)與處理的程序開(kāi)發(fā)_第2頁(yè)
Hive大數(shù)據(jù)存儲(chǔ)與處理 課件 第7、8章 廣電用戶數(shù)據(jù)清洗及數(shù)據(jù)導(dǎo)出、廣電用戶數(shù)據(jù)存儲(chǔ)與處理的程序開(kāi)發(fā)_第3頁(yè)
Hive大數(shù)據(jù)存儲(chǔ)與處理 課件 第7、8章 廣電用戶數(shù)據(jù)清洗及數(shù)據(jù)導(dǎo)出、廣電用戶數(shù)據(jù)存儲(chǔ)與處理的程序開(kāi)發(fā)_第4頁(yè)
Hive大數(shù)據(jù)存儲(chǔ)與處理 課件 第7、8章 廣電用戶數(shù)據(jù)清洗及數(shù)據(jù)導(dǎo)出、廣電用戶數(shù)據(jù)存儲(chǔ)與處理的程序開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩103頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

廣電用戶數(shù)據(jù)清洗及數(shù)據(jù)導(dǎo)出任務(wù)背景大數(shù)據(jù)分析結(jié)果的有效性在很大程度上依賴于所處理數(shù)據(jù)的質(zhì)量,使用合理的方法分析高質(zhì)量的數(shù)據(jù)將得到準(zhǔn)確的結(jié)果。數(shù)據(jù)的質(zhì)量對(duì)任何依賴于該數(shù)據(jù)的應(yīng)用所獲得結(jié)果有重要影響。數(shù)據(jù)的不完整性、不一致性、重復(fù)性和無(wú)效性等是低質(zhì)量數(shù)據(jù)的重要特征。例如,使用歐洲的用戶畫像衡量中國(guó)的用戶畫像,因?yàn)閿?shù)據(jù)描述的對(duì)象并不對(duì)應(yīng),所以這些數(shù)據(jù)是無(wú)效的、不準(zhǔn)確的。因此,一般在數(shù)據(jù)分析、數(shù)據(jù)挖掘之前,需要進(jìn)行數(shù)據(jù)探索,即探索數(shù)據(jù)的完整性、一致性、重復(fù)性和合理性等,若發(fā)現(xiàn)無(wú)效數(shù)據(jù),則應(yīng)進(jìn)行數(shù)據(jù)清洗,為后續(xù)的數(shù)據(jù)分析處理工作提供高質(zhì)量的數(shù)據(jù)。任務(wù)背景在前面章節(jié)中,使用的是廣電用戶的原始數(shù)據(jù),通過(guò)數(shù)據(jù)查詢發(fā)現(xiàn)其中存在許多缺失和異常的數(shù)據(jù),如大量數(shù)據(jù)字段中包含NULL值。在統(tǒng)計(jì)字段中的類型數(shù)量時(shí)也會(huì)對(duì)NULL值進(jìn)行計(jì)算,造成數(shù)據(jù)分析結(jié)果的不準(zhǔn)確。因此,需要對(duì)廣電用戶數(shù)據(jù)中的不符合案例分析要求的數(shù)據(jù),即無(wú)效數(shù)據(jù),進(jìn)行清洗并將清洗后的數(shù)據(jù)進(jìn)行保存。任務(wù)背景本章將對(duì)廣電用戶數(shù)據(jù)進(jìn)行探索,尋找出各表中的無(wú)效數(shù)據(jù),進(jìn)行數(shù)據(jù)清洗并將清洗后的數(shù)據(jù)進(jìn)行保存。本章將先探索無(wú)效的用戶數(shù)據(jù),如統(tǒng)計(jì)重復(fù)的用戶數(shù)和探索特殊線路用戶數(shù)據(jù)等,其次探索無(wú)效的收視行為數(shù)據(jù),分析用戶收視行為特征,篩選有效數(shù)據(jù),接著探索無(wú)效賬單和訂單數(shù)據(jù),最后將清洗好的數(shù)據(jù)進(jìn)行保存。數(shù)據(jù)清洗的過(guò)程是比較煩瑣的,但需細(xì)致入微、踔厲奮發(fā)、勇毅前行,為實(shí)現(xiàn)任務(wù)而努力、堅(jiān)持。清洗無(wú)效用戶數(shù)據(jù)清洗無(wú)效收視行為數(shù)據(jù)清洗無(wú)效賬單和訂單數(shù)據(jù)導(dǎo)出處理結(jié)果至Linux本地和HDFS清洗無(wú)效用戶數(shù)據(jù)在進(jìn)行廣電用戶數(shù)據(jù)分析時(shí),需要研究大眾用戶的行為特征。一般而言,政企用戶、內(nèi)部通信用戶、測(cè)試用戶和辦理了銷號(hào)的用戶等都是無(wú)效用戶,因此,需要對(duì)無(wú)效用戶數(shù)據(jù)進(jìn)行清洗。本任務(wù)探索廣電用戶數(shù)據(jù)中用戶編號(hào)phone_no、用戶等級(jí)編號(hào)owner_code、用戶等級(jí)名稱owner_name、品牌名稱sm_name和狀態(tài)名稱run_name這些字段中的無(wú)效用戶數(shù)據(jù)并進(jìn)行清洗。探索無(wú)效用戶數(shù)據(jù)在廣電用戶數(shù)據(jù)中,存在大量的無(wú)效用戶數(shù)據(jù),需要進(jìn)行數(shù)據(jù)探索,查找無(wú)效用戶數(shù)據(jù),然后刪除無(wú)效用戶數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)清洗。探索過(guò)程如下。1.統(tǒng)計(jì)重復(fù)的用戶數(shù)探索用戶基本數(shù)據(jù)表中是否存在重復(fù)記錄的用戶先統(tǒng)計(jì)用戶基本數(shù)據(jù)表中每個(gè)用戶記錄數(shù),結(jié)合統(tǒng)計(jì)出的結(jié)果,觀察是否存在重復(fù)記錄的用戶再分組統(tǒng)計(jì)每個(gè)用戶編號(hào)phone_no的記錄數(shù),并按記錄數(shù)降序排列,取前10條數(shù)據(jù),發(fā)現(xiàn)用戶基本數(shù)據(jù)表中不存在記錄數(shù)大于1的用戶,且phone_no分組統(tǒng)計(jì)記錄數(shù),將結(jié)果按降序排列,得到結(jié)果中所有的phone_no都唯一。探索無(wú)效用戶數(shù)據(jù)2.探索特殊線路用戶數(shù)據(jù)根據(jù)業(yè)務(wù)人員提供的數(shù)據(jù),用戶等級(jí)編號(hào)owner_code字段含有多個(gè)取值,其中值為2、9或10的記錄是特殊路線的用戶的數(shù)據(jù),特殊線路是用于用戶測(cè)試、產(chǎn)品檢驗(yàn)的。保存廣電用戶數(shù)據(jù)的5個(gè)表中都存在owner_code字段,對(duì)這5個(gè)表中是否存在特殊線路的用戶及其數(shù)量進(jìn)行分析,按照owner_code字段分組后,再統(tǒng)計(jì)該字段各值的記錄數(shù)。探索無(wú)效用戶數(shù)據(jù)以統(tǒng)計(jì)用戶基本數(shù)據(jù)表的owner_code字段值的結(jié)果為例,如圖所示,發(fā)現(xiàn)owner_code存在字段值為2的數(shù)據(jù),且所占的比例較小。此外owner_code字段還存在空值(NULL),經(jīng)過(guò)與業(yè)務(wù)人員溝通確認(rèn)owner_code字段存在空值是正常的。探索無(wú)效用戶數(shù)據(jù)對(duì)其余4個(gè)表統(tǒng)計(jì)owner_code字段值,發(fā)現(xiàn)存在2、9或10,因此各表都需要清洗owner_code字段值為2、9或10的記錄,各表的owner_code字段值如表所示。數(shù)據(jù)表owner_code字段值用戶基本數(shù)據(jù)表0、15、2、5、6、7、8、NULL用戶狀態(tài)變更數(shù)據(jù)表0、15、2、5、6、8、NULL賬單數(shù)據(jù)表0、1、15、2、30、31、4、5、6、7、8、9、NULL訂單數(shù)據(jù)表0、1、10、15、2、30、31、4、5、6、7、8、9、NULL用戶收視行為數(shù)據(jù)表0、8、15、1、5、2、6、31、7、10、NULL探索無(wú)效用戶數(shù)據(jù)3.探索政企用戶數(shù)據(jù)由于廣電公司的用戶主要是家庭用戶,所以政企用戶不納入分析范圍。根據(jù)業(yè)務(wù)人員提供的數(shù)據(jù),政企用戶的標(biāo)識(shí)是用戶等級(jí)名稱owner_name字段值為EA級(jí)、EB級(jí)、EC級(jí)、ED級(jí)或EE級(jí)。根據(jù)第3章的數(shù)據(jù)說(shuō)明所提供的數(shù)據(jù),保存廣電用戶數(shù)據(jù)的5個(gè)表中都存在owner_name字段,需要探索這些表中是否存在政企用戶以及存在的數(shù)量。按照owner_name字段進(jìn)行分組,再統(tǒng)計(jì)該字段各值的記錄數(shù)。探索無(wú)效用戶數(shù)據(jù)執(zhí)行代碼中的代碼可得出每個(gè)表的owner_name字段值的記錄數(shù),每個(gè)表存在的owner_name字段值都不一致。以用戶基本數(shù)據(jù)表的owner_name字段值為例,存在EA級(jí)、EB級(jí)和EE級(jí)。探索無(wú)效用戶數(shù)據(jù)且owner_name字段值為HC級(jí)的記錄數(shù)最多,而政企用戶的數(shù)量較少,這也印證了廣電公司的用戶主要是家庭用戶。用戶基本信息表owner_name字段數(shù)據(jù)統(tǒng)計(jì)情況。數(shù)據(jù)表owner_name字段值用戶基本數(shù)據(jù)表EA級(jí)、EB級(jí)、EE級(jí)、HA級(jí)、HB級(jí)、HC級(jí)、HE級(jí)用戶狀態(tài)變更數(shù)據(jù)表EA級(jí)、EB級(jí)、EE級(jí)、HA級(jí)、HB級(jí)、HC級(jí)賬單數(shù)據(jù)表EA級(jí)、EB級(jí)、EE級(jí)、HA級(jí)、HB級(jí)、HC級(jí)、HE級(jí)訂單數(shù)據(jù)表EA級(jí)、EB級(jí)、EE級(jí)、HA級(jí)、HB級(jí)、HC級(jí)、HE級(jí)、NULL用戶收視行為數(shù)據(jù)表EA級(jí)、EE級(jí)、HA級(jí)、HB級(jí)、HC級(jí)、HE級(jí)探索無(wú)效用戶數(shù)據(jù)從3.1.4小節(jié)可知,本書使用的數(shù)據(jù)是一段時(shí)間內(nèi)的廣電業(yè)務(wù)數(shù)據(jù),而在實(shí)際的業(yè)務(wù)數(shù)據(jù)庫(kù)中,各信息表中可能會(huì)出現(xiàn)owner_name字段值為EC級(jí)或ED級(jí)的政企用戶記錄。因此在進(jìn)行數(shù)據(jù)預(yù)處理時(shí),需要清洗owner_name字段值為EA級(jí)、EB級(jí)、EC級(jí)、ED級(jí)和EE級(jí)的政企用戶。探索無(wú)效用戶數(shù)據(jù)4.統(tǒng)計(jì)sm_name字段值廣電公司目前的業(yè)務(wù)類型主要是數(shù)字電視、互動(dòng)電視、珠江寬頻、模擬有線電視和甜果電視這5種,品牌名稱可以通過(guò)sm_name字段進(jìn)行標(biāo)識(shí)。除了用戶狀態(tài)變更數(shù)據(jù)表,其余4個(gè)表都含有sm_name字段。下面以統(tǒng)計(jì)用戶基本數(shù)據(jù)表中的所有業(yè)務(wù)類型、每種類型的用戶數(shù)以及每種類型的用戶數(shù)占比為例,實(shí)現(xiàn)sm_name字段數(shù)據(jù)探索,操作步驟如下。探索無(wú)效用戶數(shù)據(jù)首先統(tǒng)計(jì)用戶基本數(shù)據(jù)表的總記錄數(shù),將其作為后續(xù)統(tǒng)計(jì)sm_name字段值數(shù)量占比的分母。接著按sm_name字段分組統(tǒng)計(jì)該字段各值的數(shù)量及其占比,統(tǒng)計(jì)用戶基本數(shù)據(jù)表的sm_name字段各值的數(shù)量及其占比,統(tǒng)計(jì)用戶基本數(shù)據(jù)表中sm_name字段各值的數(shù)量及其占比,結(jié)果顯示,sm_name字段的值一共有5種,且模擬有線電視的用戶最多,約占總數(shù)的49%,其次數(shù)字電視的用戶約占30%?,F(xiàn)在的主要業(yè)務(wù)是互動(dòng)電視、數(shù)字電視、甜果電視、珠江寬頻,這四者約占總數(shù)的50%,需要保留這4種業(yè)務(wù)類型的用戶,刪除其他業(yè)務(wù)類型的用戶。探索無(wú)效用戶數(shù)據(jù)5.篩選正常、欠費(fèi)暫停、主動(dòng)暫停和主動(dòng)銷戶的用戶數(shù)據(jù)根據(jù)業(yè)務(wù)要求,除了需要篩選指定品牌名稱的用戶外,還需要對(duì)狀態(tài)名稱進(jìn)行過(guò)濾,只保留狀態(tài)名稱為正常、欠費(fèi)暫停、主動(dòng)暫停和主動(dòng)銷戶的用戶,其余的狀態(tài)名稱不需要進(jìn)行分析處理。狀態(tài)名稱的字段標(biāo)識(shí)為run_name,只有用戶狀態(tài)變更數(shù)據(jù)表、訂單數(shù)據(jù)表與用戶基本數(shù)據(jù)表含有run_name字段。以對(duì)用戶基本數(shù)據(jù)中的用戶狀態(tài)進(jìn)行探索為例,實(shí)現(xiàn)run_name字段數(shù)據(jù)探索,按照run_name字段分組后,再統(tǒng)計(jì)該字段各值的記錄數(shù)。探索無(wú)效用戶數(shù)據(jù)代碼得到的統(tǒng)計(jì)結(jié)果顯示run_name字段的值一共有8種。其中只保留正常、欠費(fèi)暫停、主動(dòng)暫停和主動(dòng)銷戶的用戶,其余的值不需要進(jìn)行分析處理。

探索無(wú)效用戶數(shù)據(jù)在以用戶狀態(tài)變更數(shù)據(jù)表和訂單數(shù)據(jù)表統(tǒng)計(jì)run_name字段值的統(tǒng)計(jì)結(jié)果中,同樣存在多種類型,也只需保留正常、欠費(fèi)暫停、主動(dòng)暫停和主動(dòng)銷戶的用戶數(shù)據(jù)。用戶狀態(tài)變更數(shù)據(jù)表、訂單數(shù)據(jù)表與用戶基本數(shù)據(jù)表run_name字段值,如下所示。數(shù)據(jù)表run_name字段值用戶基本數(shù)據(jù)表主動(dòng)暫停、主動(dòng)銷戶、沖正、創(chuàng)建、欠費(fèi)暫停、正常、被動(dòng)銷戶、銷號(hào)用戶狀態(tài)變更數(shù)據(jù)表主動(dòng)暫停、主動(dòng)銷戶、沖正、創(chuàng)建、欠費(fèi)暫停、正常、被動(dòng)銷戶訂單數(shù)據(jù)表主動(dòng)暫停、主動(dòng)銷戶、沖正、創(chuàng)建、欠費(fèi)暫停、正常、被動(dòng)銷戶、未激活、BG、BY、DB、DG、DI、GI、GY、NULL、Y、YB、YD、YG、YI、YN、YY、dd

刪除無(wú)效用戶數(shù)據(jù)通過(guò)對(duì)廣電用戶數(shù)據(jù)進(jìn)行無(wú)效用戶數(shù)據(jù)的探索,查詢出許多無(wú)效的用戶數(shù)據(jù)。本小節(jié)的任務(wù)是清洗無(wú)效用戶數(shù)據(jù),任務(wù)實(shí)現(xiàn)步驟如下。用戶去重。經(jīng)統(tǒng)計(jì),并無(wú)重復(fù)的用戶記錄,無(wú)須處理。清洗特殊線路用戶數(shù)據(jù),即清洗各表owner_code字段值為2、9或10的記錄。清洗政企用戶數(shù)據(jù),即清洗各表中owner_name字段值為EA級(jí)、EB級(jí)、EC級(jí)、ED級(jí)或EE級(jí)的政企用戶數(shù)據(jù)。只保留用戶基本數(shù)據(jù)表、賬單數(shù)據(jù)表、訂單數(shù)據(jù)表和用戶收視行為數(shù)據(jù)表中sm_name字段值為數(shù)字電視、互動(dòng)電視、珠江寬頻和甜果電視的數(shù)據(jù)。只保留用戶基本數(shù)據(jù)表、用戶狀態(tài)變更數(shù)據(jù)表、訂單數(shù)據(jù)表中run_name字段值為正常、欠費(fèi)暫停、主動(dòng)暫停和主動(dòng)銷戶的用戶數(shù)據(jù)。刪除無(wú)效用戶數(shù)據(jù)本任務(wù)以清洗用戶基本數(shù)據(jù)表中的數(shù)據(jù)為例,實(shí)現(xiàn)以上數(shù)據(jù)清洗要求。因?yàn)樗鶆?chuàng)建的5張廣電用戶數(shù)據(jù)Hive表均為普通的內(nèi)部表,所以將使用篩選有效數(shù)據(jù)導(dǎo)入另一個(gè)表的方式實(shí)現(xiàn)數(shù)據(jù)清洗。創(chuàng)建一個(gè)mediamatch_usermsg_clean表,將無(wú)效的數(shù)據(jù)剔除,將有效數(shù)據(jù)導(dǎo)入表中,實(shí)現(xiàn)數(shù)據(jù)清洗。如果需要驗(yàn)證mediamatch_usermsg_clean表中的數(shù)據(jù)是否有效,可以通過(guò)分組查詢owner_code、owner_name、sm_name和run_name字段值驗(yàn)證是否還存在無(wú)效數(shù)據(jù)。以驗(yàn)證mediamatch_usermsg_clean表中sm_name字段值是否全為數(shù)字電視、互動(dòng)電視、珠江寬頻或甜果電視為例。

清洗無(wú)效用戶數(shù)據(jù)清洗無(wú)效收視行為數(shù)據(jù)清洗無(wú)效賬單和訂單數(shù)據(jù)導(dǎo)出處理結(jié)果至Linux本地和HDFS清洗無(wú)效收視行為數(shù)據(jù)信息科技發(fā)展迅速,無(wú)論是硬件還是軟件每天都在更新,在計(jì)算機(jī)、手機(jī)上使用各種視頻軟件或App即可實(shí)現(xiàn)節(jié)目觀看,達(dá)到取代電視機(jī)觀看的結(jié)果。因此,新時(shí)代的人們使用電視機(jī)觀看節(jié)目的時(shí)間逐漸減少,甚至某些家庭已經(jīng)不安裝電視機(jī)了。對(duì)此,廣電公司急需研究用戶收視行為數(shù)據(jù),分析用戶的興趣,提高電視機(jī)的使用率。在分析用戶行為數(shù)據(jù)之前,應(yīng)先進(jìn)行無(wú)效收視行為數(shù)據(jù)探索,以免造成分析結(jié)果出現(xiàn)嚴(yán)重錯(cuò)誤。本任務(wù)探索用戶收視行為數(shù)據(jù)表中觀看時(shí)長(zhǎng)duration、節(jié)目類型res_type、用戶觀看開(kāi)始時(shí)間origin_time和用戶觀看結(jié)束時(shí)間end_time字段的無(wú)效收視行為數(shù)據(jù)并將其進(jìn)行刪除。探索無(wú)效收視行為數(shù)據(jù)用戶在觀看電視節(jié)目時(shí),常常為了找到喜歡的節(jié)目而頻繁地切換,這時(shí)將產(chǎn)生大量的觀看時(shí)長(zhǎng)較短的數(shù)據(jù),分析這樣的數(shù)據(jù)對(duì)研究用戶觀看興趣有較大的影響,因此需要探索并清除。此外,許多用戶只是關(guān)閉了顯示設(shè)備,轉(zhuǎn)而進(jìn)行另外的個(gè)人活動(dòng),而連接終端還處于觀看狀態(tài),因此也將產(chǎn)生大量的觀看時(shí)長(zhǎng)過(guò)長(zhǎng)的數(shù)據(jù),同樣地,這樣的數(shù)據(jù)也屬于無(wú)效數(shù)據(jù)。探索無(wú)效收視行為數(shù)據(jù)為獲得更有分析價(jià)值的用戶收視行為數(shù)據(jù),需要探索無(wú)效收視行為數(shù)據(jù)并將其清洗,探索過(guò)程如下。1.統(tǒng)計(jì)用戶收視行為記錄觀看時(shí)長(zhǎng)的均值、最值和標(biāo)準(zhǔn)差為了掌握用戶收視行為記錄中的觀看時(shí)長(zhǎng)的取值范圍,以便后續(xù)業(yè)務(wù)需求探索中為用戶收視行為無(wú)效數(shù)據(jù)的分析探索提供幫助,而且由于用戶收視行為數(shù)據(jù)表中的記錄數(shù)較多,所以有必要對(duì)用戶觀看時(shí)長(zhǎng)進(jìn)行基本的探索分析。使用AVG、MIN、MAX與STDDEV函數(shù)分別統(tǒng)計(jì)用戶觀看時(shí)長(zhǎng)的均值、最小值、最大值和標(biāo)準(zhǔn)差,由于duration字段記錄的是用戶觀看時(shí)間(以秒位單位)乘以1000的值,所以duration字段的值需要除以1000以得到以秒為單位的用戶觀看時(shí)長(zhǎng)。其中duration字段值需要使用CAST函數(shù)轉(zhuǎn)換成DOUBLE類型的值。探索無(wú)效收視行為數(shù)據(jù)從右圖所示的統(tǒng)計(jì)結(jié)果可以發(fā)現(xiàn),用戶收視行為數(shù)據(jù)表中平均每條記錄的觀看時(shí)長(zhǎng)約為1104秒(約為18分鐘)。記錄中觀看時(shí)長(zhǎng)最小值約為0秒,觀看時(shí)長(zhǎng)的最大值為17992秒(約為5小時(shí)),標(biāo)準(zhǔn)差約為1439秒(約為24分鐘)。統(tǒng)計(jì)結(jié)果說(shuō)明了用戶觀看時(shí)長(zhǎng)的范圍(0秒~5小時(shí))是比較大的,觀看時(shí)長(zhǎng)的離散程度較?。ㄓ^看時(shí)長(zhǎng)的標(biāo)準(zhǔn)差約為24分鐘)。探索無(wú)效收視行為數(shù)據(jù)2.統(tǒng)計(jì)用戶收視時(shí)長(zhǎng)分布用戶收視行為無(wú)效數(shù)據(jù)是指用戶觀看時(shí)長(zhǎng)過(guò)短或過(guò)長(zhǎng)的數(shù)據(jù),這種數(shù)據(jù)出現(xiàn)的原因可能是用戶頻繁切換頻道或只關(guān)閉電視機(jī)而忘記關(guān)閉機(jī)頂盒。在用戶收視行為數(shù)據(jù)表中,duration字段記錄了用戶的每次觀看時(shí)長(zhǎng)。由于各記錄的觀看時(shí)長(zhǎng)差異較大,所以需要將觀看時(shí)長(zhǎng)以每小時(shí)為區(qū)間進(jìn)行劃分,統(tǒng)計(jì)各區(qū)間的記錄數(shù)。首先使用COUNT函數(shù)統(tǒng)計(jì)用戶收視行為數(shù)據(jù)表的總記錄數(shù),可參考代碼實(shí)現(xiàn),統(tǒng)計(jì)結(jié)果為4754442條。接著統(tǒng)計(jì)觀看時(shí)長(zhǎng)以每小時(shí)為區(qū)間的記錄數(shù),因?yàn)閐uration字段記錄的是用戶觀看時(shí)間(以秒為單位)乘以1000的值,所以將duration字段的值除以1000×60×60即可得到觀看時(shí)長(zhǎng)以小時(shí)為單位的值,其中子查詢語(yǔ)句中的FLOOR函數(shù)的作用是向下取整,結(jié)果如圖所示。探索無(wú)效收視行為數(shù)據(jù)據(jù)圖所示的統(tǒng)計(jì)結(jié)果可知,絕大部分的觀看時(shí)長(zhǎng)都小于1小時(shí),約占總記錄數(shù)的94%,觀看時(shí)長(zhǎng)大于等于1小時(shí)小于2小時(shí)的記錄數(shù)約占總數(shù)的5.9%。由于觀看時(shí)長(zhǎng)小于1小時(shí)的記錄數(shù)占了絕大部分,所以將這部分記錄再按1分鐘為時(shí)間間隔進(jìn)行劃分,分析落在每個(gè)區(qū)間的記錄數(shù)分布情況,結(jié)果如圖所示。探索無(wú)效收視行為數(shù)據(jù)由圖可得用戶觀看時(shí)長(zhǎng)記錄數(shù)隨著時(shí)間間隔而大約呈現(xiàn)出指數(shù)遞減的趨勢(shì),其中觀看時(shí)長(zhǎng)小于1分鐘的數(shù)據(jù)最多,約占總記錄數(shù)的18%。為了進(jìn)一步了解觀看時(shí)長(zhǎng)小于1分鐘的秒級(jí)數(shù)據(jù)分布情況,再將這部分?jǐn)?shù)據(jù)按秒進(jìn)行劃分,結(jié)果如圖所示。探索無(wú)效收視行為數(shù)據(jù)左圖只展現(xiàn)了1~10s的記錄數(shù),為了更直觀地展現(xiàn)1分鐘內(nèi)每秒的記錄數(shù)和分布情況,將統(tǒng)計(jì)結(jié)果保存至Linux本地系統(tǒng)并使用Python、Excel或MATLAB等工具制作折線圖,如右圖所示。由右圖可得,觀看時(shí)長(zhǎng)在1~19秒的每個(gè)區(qū)間內(nèi)的觀看記錄數(shù)相差不大,從20秒開(kāi)始每個(gè)區(qū)間的記錄數(shù)遠(yuǎn)高于1~19秒每個(gè)區(qū)間的記錄數(shù)。綜合以上的分析統(tǒng)計(jì)結(jié)果以及結(jié)合業(yè)務(wù)的實(shí)際情況,將觀看時(shí)長(zhǎng)小于20秒和大于5小時(shí)的數(shù)據(jù)視為無(wú)效數(shù)據(jù),需要將這些數(shù)據(jù)刪除以便能夠更好地分析用戶的收視行為。探索無(wú)效收視行為數(shù)據(jù)3.查詢機(jī)頂盒自動(dòng)返回的數(shù)據(jù)在用戶收視行為數(shù)據(jù)表中,還有一部分?jǐn)?shù)據(jù)的節(jié)目類型為直播,即res_type字段值為0時(shí),觀看行為開(kāi)始時(shí)間origin_time和觀看行為結(jié)束時(shí)間end_time的秒時(shí)間單位為00結(jié)尾的記錄,這些記錄是機(jī)頂盒自動(dòng)返回的數(shù)據(jù),并不是用戶真實(shí)的觀看記錄。因此這一部分?jǐn)?shù)據(jù)也是需要?jiǎng)h除的。探索分析由機(jī)頂盒自動(dòng)返回的數(shù)據(jù)以及其數(shù)據(jù)量的大小,使用“LIKE'%00'”語(yǔ)句即可查詢某字段以00結(jié)尾的數(shù)據(jù),結(jié)果如圖所示。探索無(wú)效收視行為數(shù)據(jù)從圖所示的統(tǒng)計(jì)分析結(jié)果來(lái)看,用戶收視行為數(shù)據(jù)表中res_type字段值為0時(shí),origin_time和end_time的秒時(shí)間單位為00的記錄的確存在并且記錄數(shù)約為88萬(wàn),因此在進(jìn)行數(shù)據(jù)預(yù)處理時(shí)需要清洗這部分無(wú)效的數(shù)據(jù)。刪除無(wú)效收視行為數(shù)據(jù)對(duì)廣電用戶收視行為數(shù)據(jù)表的探索,主要是探索用戶的觀看時(shí)長(zhǎng),將無(wú)效的收視數(shù)據(jù)進(jìn)行清洗。本小節(jié)的任務(wù)是獲得更有分析價(jià)值的用戶收視行為數(shù)據(jù),探索無(wú)效收視行為數(shù)據(jù)并將其進(jìn)行清洗,任務(wù)實(shí)現(xiàn)步驟如下。統(tǒng)計(jì)用戶觀看時(shí)長(zhǎng)的均值、最值和標(biāo)準(zhǔn)差,探索用戶觀看時(shí)長(zhǎng)范圍。由圖所示的統(tǒng)計(jì)結(jié)果可得,用戶的觀看時(shí)長(zhǎng)范圍為0~5小時(shí)。根據(jù)統(tǒng)計(jì)用戶觀看時(shí)長(zhǎng)分布結(jié)果分析,刪除觀看時(shí)長(zhǎng)小于20秒和觀看時(shí)長(zhǎng)大于5小時(shí)的數(shù)據(jù)。刪除節(jié)目類型為直播,即res_type字段值為0時(shí),觀看行為開(kāi)始時(shí)間origin_time和觀看行為結(jié)束時(shí)間end_time為00的無(wú)效收視行為數(shù)據(jù)。刪除無(wú)效收視行為數(shù)據(jù)如果需要驗(yàn)證media_index_clean表中的數(shù)據(jù)是否有效,可以通過(guò)查詢觀看時(shí)長(zhǎng)duration字段的最大值、最小值,以及節(jié)目類型res_type字段是否還存在無(wú)效數(shù)據(jù)實(shí)現(xiàn)。以驗(yàn)證media_index_clean表中數(shù)據(jù)是否有效為例,結(jié)果如圖所示,可知media_index_clean不存在直播的節(jié)目類型。清洗無(wú)效用戶數(shù)據(jù)清洗無(wú)效收視行為數(shù)據(jù)清洗無(wú)效賬單和訂單數(shù)據(jù)導(dǎo)出處理結(jié)果至Linux本地和HDFS清洗無(wú)效賬單和訂單數(shù)據(jù)賬單是指與消費(fèi)者發(fā)生交易的商戶或公司向消費(fèi)者提供的賬目發(fā)生明細(xì)單,也是商戶或公司記錄和統(tǒng)計(jì)營(yíng)收的數(shù)據(jù)依據(jù)。訂單是訂購(gòu)貨物的合同或單據(jù)。用戶在挑選商品后,在實(shí)體店前臺(tái)或在網(wǎng)上下單,這時(shí)需要打印訂單表。訂單表記錄了用戶的訂購(gòu)產(chǎn)品詳細(xì)信息,一般包括用戶名稱、訂購(gòu)貨物名稱、訂購(gòu)金額和訂購(gòu)數(shù)量等。清洗無(wú)效賬單和訂單數(shù)據(jù)廣電公司的用戶賬單數(shù)據(jù)表和訂單數(shù)據(jù)表分別記錄了各用戶的消費(fèi)詳情和訂購(gòu)產(chǎn)品信息。這兩個(gè)表中存在無(wú)效數(shù)據(jù),在進(jìn)行營(yíng)收統(tǒng)計(jì)分析時(shí),若采用了無(wú)效的訂單和賬單數(shù)據(jù),則將導(dǎo)致統(tǒng)計(jì)錯(cuò)誤,因此需要對(duì)用戶賬單數(shù)據(jù)表和訂單數(shù)據(jù)表進(jìn)行數(shù)據(jù)清洗。本任務(wù)探索用戶賬單數(shù)據(jù)表中用戶應(yīng)付金額should_pay字段和用戶訂單數(shù)據(jù)表中訂購(gòu)產(chǎn)品價(jià)格cost字段的無(wú)效數(shù)據(jù)并進(jìn)行清洗。探索無(wú)效賬單數(shù)據(jù)無(wú)效賬單數(shù)據(jù)是指賬單數(shù)據(jù)表mmconsume_billevents的用戶應(yīng)付金額should_pay字段值小于0的數(shù)據(jù)。若在統(tǒng)計(jì)營(yíng)收金額時(shí)將應(yīng)收金額小于0的數(shù)據(jù)算入,則將造成營(yíng)收統(tǒng)計(jì)錯(cuò)誤。查詢無(wú)效賬單的數(shù)量,結(jié)果如圖所示。由圖所示的統(tǒng)計(jì)結(jié)果可得,賬單數(shù)據(jù)表中存在377條無(wú)效賬單數(shù)據(jù),需要將這些無(wú)效賬單數(shù)據(jù)清洗。

探索無(wú)效訂單數(shù)據(jù)無(wú)效訂單數(shù)據(jù)是指訂單數(shù)據(jù)表order_index的訂購(gòu)產(chǎn)品價(jià)格cost字段值為空或小于0的數(shù)據(jù)。若在統(tǒng)計(jì)用戶訂單金額時(shí)將無(wú)效訂購(gòu)產(chǎn)品價(jià)格算入,將造成錯(cuò)誤的收入預(yù)算,會(huì)對(duì)公司資產(chǎn)調(diào)用和計(jì)劃支出造成重大影響。查詢無(wú)效訂單數(shù)據(jù)的數(shù)量。執(zhí)行代碼中的代碼得出無(wú)效訂單數(shù)據(jù)的數(shù)量為0,即不存在訂購(gòu)產(chǎn)品價(jià)格cost字段值為空或小于0的數(shù)據(jù),因此無(wú)須清洗,如圖所示。刪除無(wú)效賬單和無(wú)效訂單數(shù)據(jù)本小節(jié)任務(wù)是刪除無(wú)效賬單和無(wú)效訂單數(shù)據(jù),經(jīng)探索分析得用戶訂單數(shù)據(jù)表中不存在無(wú)效訂單數(shù)據(jù),而用戶賬單數(shù)據(jù)表中存在無(wú)效賬單數(shù)據(jù),因此需刪除無(wú)效賬單數(shù)據(jù)即可。先創(chuàng)建mmconsume_billevents_clean表,再刪除賬單數(shù)據(jù)表中的無(wú)效賬單數(shù)據(jù),最后將清洗好的數(shù)據(jù)導(dǎo)入mmconsume_billevents_clean表中,如圖??蓞⒖即a統(tǒng)計(jì)mmconsume_billevents_clean中應(yīng)收金額小于0的數(shù)據(jù)量,驗(yàn)證是否刪除了無(wú)效賬單數(shù)據(jù),若統(tǒng)計(jì)值為0,則完成了刪除無(wú)效賬單數(shù)據(jù),如圖。清洗無(wú)效用戶數(shù)據(jù)清洗無(wú)效收視行為數(shù)據(jù)清洗無(wú)效賬單和訂單數(shù)據(jù)導(dǎo)出處理結(jié)果至Linux本地和HDFS導(dǎo)出處理結(jié)果至Linux本地和HDFS隨著移動(dòng)互聯(lián)網(wǎng)和物聯(lián)網(wǎng)的出現(xiàn)和快速發(fā)展,數(shù)據(jù)量也在爆發(fā)式增長(zhǎng),對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)量也在增大,因此誕生了分布式存儲(chǔ)框架,用于解決大數(shù)據(jù)量的存儲(chǔ)問(wèn)題。廣電公司在清洗完數(shù)百萬(wàn)條數(shù)據(jù)后,需要將數(shù)據(jù)進(jìn)行保存。本任務(wù)將清洗后的數(shù)據(jù)保存在Linux本地目錄和HDFS目錄下。使用INSERTOVERWRITE語(yǔ)句將數(shù)據(jù)導(dǎo)出至文件系統(tǒng)在HiveCLI中實(shí)現(xiàn)Hive表數(shù)據(jù)的導(dǎo)出,可以使用INSERTOVERWRITE語(yǔ)句編寫選擇導(dǎo)出的文件系統(tǒng)目錄和表內(nèi)容。使用INSERTOVERWRITE語(yǔ)句將數(shù)據(jù)導(dǎo)出至文件系統(tǒng)目錄的語(yǔ)法如下。參數(shù)說(shuō)明DIRECTORY在參數(shù)后指定數(shù)據(jù)導(dǎo)出的目錄LOCAL若使用LOCAL參數(shù),則Hive會(huì)將數(shù)據(jù)寫入Linux本地目錄下。若不使用LOCAL參數(shù),則將數(shù)據(jù)寫入HDFS目錄下ROWFORMATHive0.11.0開(kāi)始允許指定字段間的分隔符,默認(rèn)按^A字符(\001)分隔STOREDAS用于指定文件存儲(chǔ)格式,如TXT文檔或ORC優(yōu)化行柱狀文件等SELECT...FROM...用于選擇存儲(chǔ)內(nèi)容

使用INSERTOVERWRITE語(yǔ)句將數(shù)據(jù)導(dǎo)出至文件系統(tǒng)使用INSERTOVERWRITE語(yǔ)句和LOCALDIRECTORY參數(shù)將用代碼所創(chuàng)建的賬單數(shù)據(jù)清洗表mmconsume_billevents_clean中的數(shù)據(jù)導(dǎo)出至Linux本地目錄/opt/zjsm_clean/mmconsume_billevents_clean(目錄需先手動(dòng)創(chuàng)建)下,如圖。執(zhí)行代碼,在Linux本地目錄/opt/zjsm_clean/mmconsume_billevents_clean下生成一個(gè)名為000000_0的文件,文件記錄了mmconsume_billevents_clean表中的數(shù)據(jù)。在Linux終端查看000000_0文件的前10條數(shù)據(jù),結(jié)果如圖。保存處理結(jié)果至Linux本地和HDFS本章對(duì)廣電用戶數(shù)據(jù)的5個(gè)表進(jìn)行了無(wú)效數(shù)據(jù)探索并清洗,其中數(shù)據(jù)清洗規(guī)則如圖。數(shù)據(jù)表數(shù)據(jù)清洗規(guī)則賬單數(shù)據(jù)表訂單數(shù)據(jù)表用戶基本數(shù)據(jù)表用戶收視行為數(shù)據(jù)表刪除owner_name字段值為EA級(jí)、EB級(jí)、EC級(jí)、ED級(jí)、EE級(jí)的數(shù)據(jù)。刪除owner_code字段值為2、9、10的數(shù)據(jù)。保留sm_name字段值為珠江寬頻、數(shù)字電視、互動(dòng)電視、甜果電視的數(shù)據(jù)。用戶狀態(tài)變更數(shù)據(jù)表訂單數(shù)據(jù)表用戶基本數(shù)據(jù)表保留run_name字段值為正常、主動(dòng)暫停、欠費(fèi)暫停、主動(dòng)銷戶的數(shù)據(jù)。用戶基本數(shù)據(jù)表用戶編號(hào)phone_no數(shù)據(jù)去重賬單數(shù)據(jù)表刪除應(yīng)收金額should_pay字段值小于0的記錄用戶收視行為數(shù)據(jù)表收視時(shí)長(zhǎng)duration字段值大于等于20秒且duration字段值小于等于5小時(shí)的數(shù)據(jù)。刪除用戶收視行為數(shù)據(jù)表中res_type字段值為0時(shí),origin_time和end_time中為00的數(shù)據(jù)(以秒為單位)用戶狀態(tài)變更數(shù)據(jù)表刪除owner_name字段值為EA級(jí)、EB級(jí)、EC級(jí)、ED級(jí)、EE級(jí)。刪除owner_code字段值為2、9、10的數(shù)據(jù)。保存處理結(jié)果至Linux本地和HDFSLinux本地文件系統(tǒng)的安全性較好,且傳輸數(shù)據(jù)文件較為方便,如將文件傳至Windows系統(tǒng)時(shí),無(wú)須啟動(dòng)Hadoop。HDFS能夠解決大數(shù)據(jù)量的存儲(chǔ)問(wèn)題,且存儲(chǔ)效率較高。因此本小節(jié)將實(shí)現(xiàn)保存Hive清洗后的數(shù)據(jù)表至Linux本地目錄下和HDFS目錄下。以保存清洗后的用戶基本數(shù)據(jù)表mediamatch_usermsg_clean為例,使用INSERTOVERWRITE語(yǔ)句實(shí)現(xiàn)保存至Linux的/opt/zjsm_clean/mediamatch_usermsg_clean目錄下和HDFS的/opt/zjsm_clean/mediamatch_usermsg_clean目錄下。保存處理結(jié)果至Linux本地和HDFS小結(jié)本章的目標(biāo)是先探索廣電用戶無(wú)效數(shù)據(jù),再進(jìn)行數(shù)據(jù)清洗與保存。首先探索了無(wú)效用戶數(shù)據(jù),如探索重復(fù)的用戶數(shù)、特殊線路用戶數(shù)據(jù)和政企用戶數(shù)據(jù)等。其次探索了無(wú)效收視行為數(shù)據(jù),主要探索用戶觀看時(shí)長(zhǎng)。接著探索了無(wú)效賬單和訂單數(shù)據(jù),探索用戶應(yīng)付金額should_pay字段和訂購(gòu)產(chǎn)品價(jià)格cost字段是否存在小于0的數(shù)據(jù),再按照探索結(jié)果進(jìn)行數(shù)據(jù)清洗。最終將清洗結(jié)果保存至Linux本地目錄和HDFS目錄。廣電用戶數(shù)據(jù)存儲(chǔ)與

處理的程序開(kāi)發(fā)任務(wù)背景Hive與一般數(shù)據(jù)倉(cāng)庫(kù)使用傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)作為基礎(chǔ)平臺(tái)不同,Hive基于Hadoop平臺(tái)構(gòu)建,這使得Hive天然具備大數(shù)據(jù)處理能力。在之前的學(xué)習(xí)和實(shí)踐中,使用Hive都是通過(guò)CLI的方式,該方式僅允許使用HQL執(zhí)行查詢等操作,并且該方式比較笨拙、單一。其實(shí)Hive也提供了輕客戶端的實(shí)現(xiàn),通過(guò)HiveServer或HiveServer2,客戶端可以在不啟動(dòng)CLI的情況下對(duì)Hive中的數(shù)據(jù)進(jìn)行操作,兩者都允許遠(yuǎn)程客戶端使用多種編程語(yǔ)言如Java、Python向Hive提交請(qǐng)求,返回結(jié)果。學(xué)習(xí)多種方式操作Hive中的數(shù)據(jù),落實(shí)科教興國(guó)戰(zhàn)略。任務(wù)背景本章主要介紹如何配置Hive遠(yuǎn)程服務(wù),搭建Hive遠(yuǎn)程開(kāi)發(fā)環(huán)境,通過(guò)案例實(shí)現(xiàn)廣電數(shù)據(jù)的存儲(chǔ)和廣電用戶數(shù)據(jù)的查詢與處理,并在此過(guò)程中學(xué)習(xí)通過(guò)IDEA編程軟件進(jìn)行程序運(yùn)行、調(diào)試的主要過(guò)程和方法。配置Hive遠(yuǎn)程服務(wù)搭建Hive遠(yuǎn)程連接環(huán)境編寫程序?qū)崿F(xiàn)廣電數(shù)據(jù)的存儲(chǔ)編寫程序?qū)崿F(xiàn)廣電數(shù)據(jù)的查詢與處理任務(wù)描述在HiveCLI中,一次只能運(yùn)行一條HQL語(yǔ)句,對(duì)于單詞、語(yǔ)句編寫失誤造成的運(yùn)行失敗也無(wú)法立刻修改,只能重新編寫語(yǔ)句,因此效率偏低。在編程類的軟件中進(jìn)行HQL語(yǔ)句的編寫、運(yùn)行,可以避免上述問(wèn)題的出現(xiàn)。為了實(shí)現(xiàn)Hive程序調(diào)用,需要提前配置和啟動(dòng)Hive遠(yuǎn)程服務(wù)。本任務(wù)配置Hive遠(yuǎn)程服務(wù)HiveServer2。配置Hive遠(yuǎn)程服務(wù)Hive0.10.0版本具有一個(gè)可選的組件HiveServer,用于為Hive提供一種允許客戶端遠(yuǎn)程訪問(wèn)的服務(wù)。HiveServer基于Thrift協(xié)議,故也稱HiveServer為ThriftServer。HiveServer支持跨平臺(tái)、跨編程語(yǔ)言對(duì)Hive進(jìn)行訪問(wèn);由于HiveServer受Thrift接口限制,所以HiveServer不能處理多于一個(gè)客戶端的并發(fā)請(qǐng)求。為實(shí)現(xiàn)多用戶并發(fā)訪問(wèn),Hive0.11.0版本重寫HiveServer代碼得到了HiveServer2。HiveServer2支持多客戶端的并發(fā)和認(rèn)證,用于為客戶端通過(guò)API(例如JDBC、ODBC等)訪問(wèn)Hive提供更好的支持。配置Hive遠(yuǎn)程服務(wù)配置并啟動(dòng)Hive遠(yuǎn)程服務(wù)的操作如下。配置Hive遠(yuǎn)程連接屬性。在master主節(jié)點(diǎn)執(zhí)行命令“vim/usr/local/hadoop-3.1.4/etc/hadoop/core-site.xml”,打開(kāi)core-site.xml文件,然后進(jìn)入編輯模式,添加Hive遠(yuǎn)程服務(wù)的屬性,Hive遠(yuǎn)程服務(wù)的屬性內(nèi)容,修改好后按Esc鍵,輸入“:wq”并按Enter鍵保存退出。<property> <name>xyuser.root.hosts</name> <value>*</value></property><property> <name>xyuser.root.groups</name> <value>*</value></property>配置Hive遠(yuǎn)程服務(wù)分發(fā)配置文件至各子節(jié)點(diǎn)。將core-site.xml文件使用scp命令發(fā)送給各子節(jié)點(diǎn)。啟動(dòng)Hive遠(yuǎn)程服務(wù)。啟動(dòng)Hadoop集群和MySQL服務(wù)后,啟動(dòng)Hive元數(shù)據(jù)庫(kù)服務(wù)、HiveServer2遠(yuǎn)程服務(wù),運(yùn)行結(jié)果如下圖。配置Hive遠(yuǎn)程服務(wù)啟動(dòng)遠(yuǎn)程服務(wù)之前,要啟動(dòng)Hive元數(shù)據(jù)服務(wù),否則在后續(xù)連接Hive,執(zhí)行一系列數(shù)據(jù)操作時(shí),編程軟件會(huì)提示“Connectionrefused:connect”的錯(cuò)誤。配置Hive遠(yuǎn)程服務(wù)搭建Hive遠(yuǎn)程連接環(huán)境編寫程序?qū)崿F(xiàn)廣電數(shù)據(jù)的存儲(chǔ)編寫程序?qū)崿F(xiàn)廣電數(shù)據(jù)的查詢與處理任務(wù)描述IntelliJIDEA簡(jiǎn)稱IDEA,是Java等編程語(yǔ)言開(kāi)發(fā)集成環(huán)境之一,該集成環(huán)境在智能代碼助手、代碼自動(dòng)提示、重構(gòu)、JavaEE支持、各類版本工具(Git、SVN等)、JUnit、CVS整合、代碼分析、創(chuàng)新的GUI設(shè)計(jì)等方面較為優(yōu)秀。本任務(wù)在IDEA上搭建Hive開(kāi)發(fā)環(huán)境,并實(shí)現(xiàn)Hive遠(yuǎn)程連接測(cè)試。創(chuàng)建IDEA開(kāi)發(fā)項(xiàng)目讀者可到JetBrains公司的官方網(wǎng)站自行下載相關(guān)版本的IDEA編程軟件安裝包。對(duì)于個(gè)人用戶,可下載Community版(社區(qū)版)的IDEA編程軟件安裝包。下載后,請(qǐng)按照指示進(jìn)行安裝。本書統(tǒng)一使用“IntelliJIDEACommunityEdition2021.3.3”版本。IDEA默認(rèn)選用英文界面運(yùn)行,讀者也可根據(jù)個(gè)人需求在插件管理中下載中文語(yǔ)言包。為了描述方便,本書統(tǒng)一以英文界面進(jìn)行講解。創(chuàng)建IDEA開(kāi)發(fā)項(xiàng)目在安裝好編程軟件后,即可創(chuàng)建IDEA開(kāi)發(fā)項(xiàng)目,創(chuàng)建流程如下。打開(kāi)編程軟件IDEA,彈出歡迎界面,如下圖,單擊“NewProject”按鈕。創(chuàng)建IDEA開(kāi)發(fā)項(xiàng)目在“NewProject”界面中選擇“Maven”選項(xiàng),在“ProjectSDK”下拉列表框中選擇1.8版本的JDK,如下圖,單擊“Next”按鈕。創(chuàng)建IDEA開(kāi)發(fā)項(xiàng)目將項(xiàng)目命名為“HiveJavaAPI”,并將該項(xiàng)目放置在D盤根目錄下,如下圖,單擊“Finish”按鈕。創(chuàng)建IDEA開(kāi)發(fā)項(xiàng)目項(xiàng)目創(chuàng)建完成后,會(huì)自動(dòng)生成項(xiàng)目框架,如下圖。創(chuàng)建IDEA開(kāi)發(fā)項(xiàng)目項(xiàng)目初始框架包含的項(xiàng)目元素如下表。項(xiàng)目元素說(shuō)明項(xiàng)目根目錄項(xiàng)目存儲(chǔ)的本地目錄,項(xiàng)目HiveJavaAPI的安裝目錄為D:\HiveJavaAPI.idea節(jié)點(diǎn)主要用于保存IDEA項(xiàng)目的相關(guān)信息src節(jié)點(diǎn)用于保存源代碼(main目錄)和測(cè)試代碼(test目錄)ExternalLibraries節(jié)點(diǎn)用于保存使用到的外部庫(kù)文件鏈接ScratchesandConsoles可提供Scratchfiles和Scratchbuffers這兩種臨時(shí)的編輯環(huán)境,在臨時(shí)的編輯環(huán)境中,讀者可以通過(guò)編寫一些文本內(nèi)容或一些代碼片段,實(shí)現(xiàn)IDEA功能測(cè)試創(chuàng)建IDEA開(kāi)發(fā)項(xiàng)目項(xiàng)目具體結(jié)構(gòu)如右圖。添加依賴創(chuàng)建好項(xiàng)目后,需要在項(xiàng)目的pom.xml文件中添加Hive相關(guān)依賴。在pom.xml文檔界面中,單擊鼠標(biāo)右鍵選擇“Maven”命令,再選擇“Reloadproject”命令,如右圖,可立即加載依賴。加載完成后,可在左邊Project工具欄中單擊“ExternalLibraries”查看。添加依賴加載完成后,相關(guān)的依賴包會(huì)默認(rèn)保存到系統(tǒng)用戶目錄下的.m2/repository子目錄下,如下圖。手動(dòng)加載MySQL驅(qū)動(dòng)在加載MySQL驅(qū)動(dòng)前,需要在MySQLJAR包下載官網(wǎng)中提前下載驅(qū)動(dòng)JAR包“mysql-connector-java-8.0.20.jar”,并將其復(fù)制到本地磁盤的“HiveJavaAPI連接驅(qū)動(dòng)”目錄下。在創(chuàng)建好的IDEA項(xiàng)目里加載MySQL驅(qū)動(dòng)的流程如下。單擊菜單“File”,選擇“ProjectStructure”選項(xiàng),在彈出的“ProjectStructure”界面中選擇“Libraries”選項(xiàng),單擊加號(hào)“+”按鈕,選擇“Java”選項(xiàng),如下圖。手動(dòng)加載MySQL驅(qū)動(dòng)選擇存放MySQL驅(qū)動(dòng)JAR包的本地目錄,定位到連接驅(qū)動(dòng)的位置并選中,如下圖,單擊“OK”按鈕。手動(dòng)加載MySQL驅(qū)動(dòng)在彈出的界面“ChooseModules”中選擇“HiveJavaAPI”選項(xiàng),如左圖,然后單擊“OK”按鈕,返回到“ProjectStructure”界面后,如右圖,單擊“Apply”按鈕,即可完成驅(qū)動(dòng)加載。手動(dòng)加載MySQL驅(qū)動(dòng)添加驅(qū)動(dòng)后的項(xiàng)目視圖會(huì)顯示加載的新驅(qū)動(dòng)列表,如下圖。JDBC及其主要接口JDBC是Java數(shù)據(jù)庫(kù)連接(JavaDataBaseConnectivity)的縮寫,它是一套用于執(zhí)行SQL語(yǔ)句的JavaAPI。應(yīng)用程序可通過(guò)JDBC連接到關(guān)系數(shù)據(jù)庫(kù),并通過(guò)使用SQL語(yǔ)句完成數(shù)據(jù)庫(kù)中數(shù)據(jù)的查詢、新增、更新和刪除等操作。不同數(shù)據(jù)庫(kù)處理數(shù)據(jù)的方式并不太相同,如果直接使用數(shù)據(jù)庫(kù)廠商提供的訪問(wèn)接口操作數(shù)據(jù)庫(kù),那么應(yīng)用程序的可移植性會(huì)變得較差。有了JDBC后,便可解決應(yīng)用程序可移植性差的問(wèn)題,因?yàn)镴DBC要求各個(gè)數(shù)據(jù)庫(kù)廠商按照統(tǒng)一的規(guī)范來(lái)提供數(shù)據(jù)庫(kù)驅(qū)動(dòng)。在應(yīng)用程序中由JDBC和具體的數(shù)據(jù)庫(kù)驅(qū)動(dòng)聯(lián)系,所以讀者不必直接與底層的數(shù)據(jù)庫(kù)交互,使得代碼的通用性更強(qiáng)。JDBC在應(yīng)用程序與數(shù)據(jù)庫(kù)之間起到橋梁作用,當(dāng)應(yīng)用程序使用JDBC訪問(wèn)特定的數(shù)據(jù)庫(kù)時(shí),需要通過(guò)不同的數(shù)據(jù)庫(kù)驅(qū)動(dòng)與不同的數(shù)據(jù)庫(kù)進(jìn)行連接,連接后即可對(duì)該數(shù)據(jù)庫(kù)進(jìn)行相應(yīng)的操作。JDBC及其主要接口Hive-JDBC驅(qū)動(dòng)是專用于Hive的JDBC驅(qū)動(dòng),客戶端可通過(guò)JDBC訪問(wèn)Hive。8.2.3小節(jié)中已在pom.xml文件中添加了對(duì)JDBC驅(qū)動(dòng)的依賴。在開(kāi)發(fā)JDBC驅(qū)動(dòng)前,需要了解JDBC常用的API。JDBCAPI主要位于java.sql包中,java.sql包定義了一系列訪問(wèn)數(shù)據(jù)庫(kù)的接口和類,常用接口包括Driver、DriverManager、Connection、Statement、PreparedStatement、ResultSet等。JDBC及其主要接口1.Driver接口Driver接口是所有JDBC驅(qū)動(dòng)必須實(shí)現(xiàn)的接口,該接口專門提供給數(shù)據(jù)庫(kù)廠商使用。需要注意的是,在編寫JDBC驅(qū)動(dòng)時(shí),必須將所使用的數(shù)據(jù)庫(kù)驅(qū)動(dòng)或類庫(kù)加載至項(xiàng)目的Classpath中。在進(jìn)行Java開(kāi)發(fā)時(shí),程序員只需要根據(jù)程序使用的驅(qū)動(dòng)類型,針對(duì)對(duì)應(yīng)的Driver接口裝載即可,Driver接口的方法如下表。方法名稱功能描述class.forName("sun.jdbc.odbc.jdbcOdbcDriver")通過(guò)ODBC-JDBC驅(qū)動(dòng)程序裝載JDBC驅(qū)動(dòng)class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver")通過(guò)MSSQL2000數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序裝載JDBC驅(qū)動(dòng)JDBC及其主要接口方法名稱功能描述class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")通過(guò)MSSQL2005數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序裝載JDBC驅(qū)動(dòng)class.forName("com.mysql.cj.jdbc.Driver")通過(guò)MySQL數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序裝載JDBC驅(qū)動(dòng)class.forName("oracle.jdbc.driver.OracleDriver")通過(guò)Oracle數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序裝載JDBC驅(qū)動(dòng)JDBC及其主要接口2.DriverManager接口DriverManager接口是JDBC提供的工具類,用于加載JDBC驅(qū)動(dòng)、建立與數(shù)據(jù)庫(kù)之間的連接。DriverManager類中的方法都是靜態(tài)方法,因此在程序中無(wú)須對(duì)DriverManager類中的方法進(jìn)行實(shí)例化,直接通過(guò)類名即可調(diào)用。DriverManager接口的方法如下表。方法名稱功能描述staticvoidregisterDriver(Driverdriver)該方法用于向DriverManager注冊(cè)給定的JDBC驅(qū)動(dòng)staticConnectiongetConnection(Stringurl,Stringuser,Stringpwd)該方法用于建立與數(shù)據(jù)庫(kù)之間的連接,并返回表示連接的Connection對(duì)象JDBC及其主要接口3.Connection接口Connection接口的主要作用是與特定數(shù)據(jù)庫(kù)進(jìn)行連接,在連接上下文中執(zhí)行SQL語(yǔ)句并返回結(jié)果。Connection接口的主要方法如下表。方法名稱功能描述publicjava.sql.DatabaseMetaDatagetMetaData()該方法用于返回表示數(shù)據(jù)庫(kù)的元數(shù)據(jù)的DatabaseMeta對(duì)象StatementcreateStatement()該方法用于創(chuàng)建將SQL語(yǔ)句發(fā)送至數(shù)據(jù)庫(kù)的Statement對(duì)象PreparedStatementprepareStatement(Stringsql)該方法用于創(chuàng)建將參數(shù)化的SQL語(yǔ)句發(fā)送至數(shù)據(jù)庫(kù)的PreparedStatement對(duì)象CallableStatementprepareCall(Stringsql)該方法用于創(chuàng)建調(diào)用數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的CallableStatement對(duì)象JDBC及其主要接口4.Statement接口Statement接口用于執(zhí)行靜態(tài)SQL語(yǔ)句并返回所生成結(jié)果的對(duì)象,Statement接口對(duì)象可以通過(guò)Connection接口實(shí)例的createStatement()方法獲得。Statement接口的主要方法如下表。方法名稱功能描述booleanexecute(Stringsql)該方法用于執(zhí)行各種SQL語(yǔ)句,并返回BOOLEAN類型的值,如果值為true,那么表示所執(zhí)行的SQL語(yǔ)句有查詢結(jié)果,可以通過(guò)Statement接口的getResultSet()方法獲得查詢結(jié)果intexecuteUpdate(Stringsql)該方法用于執(zhí)行SQL中的INSERT、UPDATE和DELETE語(yǔ)句,并返回INT類型的值,表示數(shù)據(jù)庫(kù)中受該SQL語(yǔ)句影響的記錄條數(shù)ResultSetexecuteQuery(Stringsql)該方法用于執(zhí)行SQL中的SELECT語(yǔ)句,并返回表示查詢結(jié)果的ResultSet對(duì)象JDBC及其主要接口5.PreparedStatement接口PreparedStatement接口是Statement接口的子接口,表示預(yù)編譯的SQL語(yǔ)句的對(duì)象。該接口擴(kuò)展了帶有參數(shù)SQL語(yǔ)句的執(zhí)行操作,應(yīng)用該接口中的SQL語(yǔ)句可以使用占位符“?”代替參數(shù),然后通過(guò)setXxx()方法為SQL語(yǔ)句的參數(shù)賦值。PreparedStatement接口的主要方法如表所示。方法名稱功能描述intexecuteUpdate()該方法用于執(zhí)行SQL語(yǔ)句,SQL語(yǔ)句必須是DML語(yǔ)句或是無(wú)返回內(nèi)容的SQL語(yǔ)句,如DDL語(yǔ)句ResultSetexecuteQuery()該方法用于執(zhí)行SQL查詢,并返回ResultSet對(duì)象voidsetInt(int

parameterIndex,int

x)該方法用于將指定參數(shù)設(shè)置成給定的INT值voidsetString(intparameterIndex,Stringx)該方法用于將指定參數(shù)設(shè)置成給定的STRING值JDBC及其主要接口6.ResultSet接口ResultSet接口表示數(shù)據(jù)庫(kù)查詢的結(jié)果集,通常通過(guò)執(zhí)行查詢數(shù)據(jù)庫(kù)的語(yǔ)句生成,主要用于保存JDBC執(zhí)行查詢時(shí)返回的結(jié)果。該結(jié)果集被封裝在一個(gè)邏輯表格中,在ResultSet接口內(nèi)部有一個(gè)指向表格數(shù)據(jù)行的游標(biāo)。ResultSet接口初始化時(shí),游標(biāo)默認(rèn)指向第一行之前,可調(diào)用next()方法移動(dòng)游標(biāo)到下一行,直至下一行為空則返回FALSE。ResultSet接口的主要方法如下表。方法名稱功能描述StringgetString(intcolumnIndex)該方法用于獲取指定字段的STRING類型的值,參數(shù)columnIndex代表字段的索引StringgetString(StringcolumnName)該方法用于獲取指定字段的STRING類型的值,參數(shù)columnName代表字段的名稱JDBC及其主要接口續(xù)上表方法名稱功能描述intgetInt(intcolumnIndex)該方法用于獲取指定字段的INT類型的值,參數(shù)columnIndex代表字段的索引intgetInt(StringcolumnName)該方法用于獲取指定字段的INT類型的值,參數(shù)columnName代表字段的名稱booleannext()該方法用于將游標(biāo)從當(dāng)前位置向下移一行創(chuàng)建連接測(cè)試程序使用JDBC連接數(shù)據(jù)庫(kù)時(shí),通常需要提供如下4個(gè)必要參數(shù)。驅(qū)動(dòng)類名:“org.apache.hive.jdbc.HiveDriver”。連接地址和端口號(hào):“jdbc:hive2://master:10000”。用戶名:使用默認(rèn)用戶root。密碼:使用默認(rèn)密碼123456。創(chuàng)建連接測(cè)試程序在IDEA中創(chuàng)建連接測(cè)試程序,實(shí)現(xiàn)連接Hive數(shù)據(jù)庫(kù)并創(chuàng)建數(shù)據(jù)庫(kù)test,操作如下。創(chuàng)建Java類。選擇main節(jié)點(diǎn)下面的java文件夾,單擊鼠標(biāo)右鍵選擇“New”命令,選擇“JavaClass”命令,如下圖。在彈出的界面輸入“Connection”,按Enter鍵,創(chuàng)建新的Java類“Connection.java”。創(chuàng)建連接測(cè)試程序編輯代碼。在新建的Java類Connection.java中進(jìn)行與Hive默認(rèn)數(shù)據(jù)庫(kù)DEFAULT的連接,并創(chuàng)建新的數(shù)據(jù)庫(kù)test。運(yùn)行程序。在對(duì)應(yīng)代碼文件中,單擊鼠標(biāo)右鍵選擇“Run'Connection.main()'”命令運(yùn)行代碼,在下方工具欄“Run”運(yùn)行結(jié)果出現(xiàn)“Processfinishedwithexitcode0”表示運(yùn)行無(wú)誤,如下圖。創(chuàng)建連接測(cè)試程序驗(yàn)證。在HiveCLI,使用“SHOWDATABASES;”命令查詢數(shù)據(jù)庫(kù),可以看到剛創(chuàng)建的數(shù)據(jù)庫(kù)test,如下圖。至此,Hive的開(kāi)發(fā)環(huán)境搭建成功。配置Hive遠(yuǎn)程服務(wù)搭建Hive遠(yuǎn)程連接環(huán)境編寫程序?qū)崿F(xiàn)廣電數(shù)據(jù)的存儲(chǔ)編寫程序?qū)崿F(xiàn)廣電數(shù)據(jù)的查詢與處理任務(wù)描述在實(shí)現(xiàn)Hive遠(yuǎn)程服務(wù)配置和Hive遠(yuǎn)程服務(wù)調(diào)用的基礎(chǔ)上,通過(guò)在IDEA中編寫程序?qū)崿F(xiàn)廣電大案例的5個(gè)數(shù)據(jù)表創(chuàng)建和數(shù)據(jù)裝載的代碼封裝。本任務(wù)將介紹如何在IDEA開(kāi)發(fā)環(huán)境中調(diào)試程序,通過(guò)程序調(diào)用的方式,將廣電數(shù)據(jù)存儲(chǔ)至Hive。創(chuàng)建開(kāi)發(fā)項(xiàng)目打開(kāi)編程軟件IDEA,選擇“File”→“New”,創(chuàng)建項(xiàng)目ZJSM,并將該項(xiàng)目放置在本地目錄(如“D:\Hive\ZJSM”)。創(chuàng)建的具體操作可參考上小節(jié)中的內(nèi)容,ZJSM項(xiàng)目視圖如下圖。在項(xiàng)目的pom.xml文件中添加Hive相關(guān)依賴,操作參照上小節(jié)中的內(nèi)容。創(chuàng)建HiveHelper類和連接Hive在src/main/java目錄下創(chuàng)建新的Java類HiveHelper,用于進(jìn)行數(shù)據(jù)庫(kù)相關(guān)操作。在HiveHelper類中創(chuàng)建一個(gè)新方法getConn(),用于通過(guò)使用JDBC連接Hive數(shù)據(jù)庫(kù)。由于在連接過(guò)程中可能出現(xiàn)驅(qū)動(dòng)無(wú)法加載或訪問(wèn)數(shù)據(jù)錯(cuò)誤等異常,故此處使用異常處理或拋出異常。創(chuàng)建測(cè)試類在src/test/java目錄下創(chuàng)建新的測(cè)試類HiveTest,用于調(diào)用HiveHelper類,完成相關(guān)的數(shù)據(jù)庫(kù)操作。創(chuàng)建Hive數(shù)據(jù)庫(kù)在HiveHelper類中創(chuàng)建一個(gè)新方法createDatabase(StringdbName),用于創(chuàng)建系統(tǒng)數(shù)據(jù)庫(kù),需要使用異常處理。創(chuàng)建Hive表在HiveHelper類中創(chuàng)建一個(gè)新方法createTable2(StringdbName),用于創(chuàng)建系統(tǒng)數(shù)據(jù)庫(kù),需要使用異常處理。由于數(shù)據(jù)表較多,僅以其中一份表,即用戶狀態(tài)變更數(shù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論