Hive大數據存儲與處理 課件 第7、8章 廣電用戶數據清洗及數據導出、廣電用戶數據存儲與處理的程序開發_第1頁
Hive大數據存儲與處理 課件 第7、8章 廣電用戶數據清洗及數據導出、廣電用戶數據存儲與處理的程序開發_第2頁
Hive大數據存儲與處理 課件 第7、8章 廣電用戶數據清洗及數據導出、廣電用戶數據存儲與處理的程序開發_第3頁
Hive大數據存儲與處理 課件 第7、8章 廣電用戶數據清洗及數據導出、廣電用戶數據存儲與處理的程序開發_第4頁
Hive大數據存儲與處理 課件 第7、8章 廣電用戶數據清洗及數據導出、廣電用戶數據存儲與處理的程序開發_第5頁
已閱讀5頁,還剩103頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

探索無效用戶數據在以用戶狀態變更數據表和訂單數據表統計run_name字段值的統計結果中,同樣存在多種類型,也只需保留正常、欠費暫停、主動暫停和主動銷戶的用戶數據。用戶狀態變更數據表、訂單數據表與用戶基本數據表run_name字段值,如下所示。數據表run_name字段值用戶基本數據表主動暫停、主動銷戶、沖正、創建、欠費暫停、正常、被動銷戶、銷號用戶狀態變更數據表主動暫停、主動銷戶、沖正、創建、欠費暫停、正常、被動銷戶訂單數據表主動暫停、主動銷戶、沖正、創建、欠費暫停、正常、被動銷戶、未激活、BG、BY、DB、DG、DI、GI、GY、NULL、Y、YB、YD、YG、YI、YN、YY、dd

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

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

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

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

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

parameterIndex,int

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

溫馨提示

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

評論

0/150

提交評論