數據挖掘——流數據分析實訓




中軟國際《分布式計算框架》機試題

 實訓項目 :      數據挖掘——流數據分析實訓                
項目源碼獲取:       

                     https://pan.baidu.com/s/1glq3tKyl3InURMrjeVCa7g    提取碼:zaj5

                                                          
注意事項:考試時間120分鍾,滿分100分。
請創建以自己姓名命名的文件夾,並創建以題號命名的子文件夾,對試題答案進行分類。
請不要在試卷上塗寫與試題無關的標記。

(一) 編程題(共100分)
1.某公司2018年第一季度職員工資數據, 格式如下: (40分)
    

     

1)成功連接HDFS服務;(10分)
2)若/salaryInput目錄不存在,創建這個目錄;(10分)
3)成功上傳職員工資數據文件到HDFS分布式文件系統中存儲。(20分)

2.分析HDFS中/salaryInput目錄下的職員工資數據 (60分)
1)計算第一季度每位職員的季度總工資;(10分)
2)計算第一季度每位職員的月度平均工資;(10分)
3)計算第一季度每位職員的月度最大工資;(10分)
4)計算第一季度公司所發的工資總數;(15分)
5)計算出第一季度工資最高的職員姓名。(15分)
提示:每個小題可以單獨使用一個MR程序來計算,部分小題可以使用一個MR程序一起計算。

 

 

 

 

 

 


解題實現思路:

     一、集群信息
          主節點 IP MAC地址
                    cMaster 192.168.1.120 00:50:56:29:3F:6E
                    cSlave01 192.168.1.121 00:50:56:21:DC:BB

   二、項目說明
     1、package:
             com.hdfs 第1題           com.salary 第2題
     2、Class:
           testHDFS 1)                                              成功連接HDFS服務;   
           CreateFolder 2)                                        若/salaryInput目錄不存在,創建這個目錄;
           UploadFile 3)                                           上傳職員工資數據文件到HDFS分布式文件系統中存儲。  
          Quarterly_wage_everyone                           1、計算第一季度每位職員的季度總工資      
          Average_monthly_everyone                          2、計算第一季度每位職員的月度平均工資       
          Max_monthly_everyone                                3、計算第一季度每位職員的月度最大工資    
         Quarterly_wage_total                                     4、計算第一季度公司所發的工資總數        
         Quarterly_name_maxwage                            5、計算出第一季度工資最高的職員姓名   

  三、具體實現思路
          1-1 testHDFS :
                  需求:連接HDFS服務
                  思路:要想連接HDFS,需要正確寫對連接參數。通過操作HDFS上的文件,可直接證明能成功連接HDFS服務
                 實現: 首先以root用戶,嘗試性地加載hdfs API訪問鏈接,往HDFS上新建/myfile1文件,並追加適當內容;
                           再讀取/myfile1文件信息的塊大小、文件大小和文件所屬者等信息,最后刪除該文件。測試HDFS服務系統的連接性。

         1-2 CreateFolder:
                 需求:若/salaryInput目錄不存在,創建這個目錄。
                 實現思路:FileSystem實例對象有delete()和mkdirs()方法。

        1-3 UploadFile :
                  需求:上傳職員工資數據文件到HDFS分布式文件系統中存儲。
                   思路:FileSystem實例對象有copyFromLocalFile()方法可快速實現。
                 實現:通過參數連接HDFS系統,先定義本地需上傳文件的文件路徑,再設置上傳到HDFS的目標路徑,最后可通過copyFromLocalFile方法進行上傳。

      2-1 Quarterly_wage_everyone:
                 需求:1)計算第一季度每位職員的季度總工資。
                思路:通過切塊和合並,可將三個文本中相同名字對應的數值相加,要轉換類型。
                實現: 內嵌Quarterly_wage_everyoneMapper和Quarterly_wage_everyoneReducer靜態類Quarterly_wage_everyoneMapper內部類繼承                             Mapper<LongWritable,Text,Text,IntWritable>,Quarterly_wage_everyoneReducer內部類繼承Reducer<Text,IntWritable,Text,IntWritable>
先在main()方法中設置傳入和傳出文件的路徑等信息,Quarterly_wage_everyoneMapper 將輸入的數據首先按行進行分割,再按每行空格划分,最后將分割的
name和scoreInt傳入Quarterly_wage_everyoneReducer類。Reducer通過int sum在Iterator<IntWritable> iterator循環基礎上,累加iterator.next().get()數據
最后將key和累加和進行輸出。

      2-2 Average_monthly_everyone:
              需求:2)計算第一季度每位職員的月度平均工資。
              思路:通過切塊和合並,可將三個文本中相同名字對應的數值相加再除以三個月,要轉換類型。
             實現: 內嵌Average_monthly_everyoneMapper和Average_monthly_everyoneReducer靜態類,
                  Average_monthly_everyoneMapper內部類繼承Mapper<LongWritable,Text,Text,IntWritable>,Average_monthly_everyoneReducer內部類繼承                  Reducer<Text,IntWritable,Text,IntWritable>先在main()方法中設置傳入和傳出文件的路徑等信息,Average_monthly_everyoneMapper 將輸入的數據首先按行進行分割,再按每行空格划分,最后將分割的name和scoreInt傳入Average_monthly_everyoneReducer類。Reducer在Iterator<IntWritable> iterator循環基礎上,通過int sum累加iterator.next().get()數據,以及讓int count自加,再通過sum / count方法計算平均工資。最后將key和累加和進行輸出。

 

 

       2-3 Max_monthly_everyone:
              需求:3)計算第一季度每位職員的月度最大工資。
              思路:可將三個文本中,相同名字對應的數值進行比較,保留最大值即可。
               實現: 內嵌Max_monthly_everyoneMapper和Max_monthly_everyoneReducer靜態類,
 Max_monthly_everyoneMapper內部類繼承Mapper<LongWritable,Text,Text,IntWritable>,Max_monthly_everyoneReducer內部類繼承Reducer<Text,IntWritable,Text,IntWritable>先在main()方法中設置傳入和傳出文件的路徑等信息,Max_monthly_everyoneMapper 將輸入的數據首先按行進行分割,再按每行空格划分,最后將分割的name和scoreInt傳入Max_monthly_everyoneReducer類。Reducer在Iterator<IntWritable> iterator循環基礎上,通過int sum承接來自iterator.next().get()數據,將sum的值強制轉換成int型。設置最大屬性標簽int max,同時在迭代循環中比較標簽值和強制轉換值的大小,通過比較而保留最大的數值,以達到輸出最大工資值的目的。
最后將key和累加和進行輸出。

 

 

          2-4 Quarterly_wage_total:
需求:4)計算第一季度公司所發的工資總數。
思路:可在1)的基礎上,將各個員工的季度總工資累加求和。
實現: 先在main()方法中設置傳入和傳出文件的路徑等信息,此處為了統計的便捷性,輸入的結果為Quarterly_wage_everyone輸出的內容。 Quarterly_wage_totalMapper
將輸入的數據首先按行進行分割,再按每行空格划分,最后將分割的name和scoreInt傳入Quarterly_wage_totalReducer類。Reducer內設Iterator<IntWritable> iterator循環,
通過int sum累加來自iterator.next().get()的數據,將sum的值強制轉換成int型,再將key和累加和進行輸出結果為temp。至此,第一次運算完成。在main()方法中設置傳入的數據
來自上一次運行結果temp,以此重復第一次執行流程。

 

      2-5Quarterly_name_maxwage:
           需求:5)計算出第一季度工資最高的職員姓名。
           思路:實現的方法各種各樣,首先說一下對題目的理解:以第一季度和工資最高為條件進行求職員姓名。其中,包括:
             1、以第一季度個人工資和最高為參考;2、以第一季度個人月工資最高為參考。
                   本例實現前者,以第一季度個人工資和最高為參考。所以對1)的結果先進行排序,再選中最高者輸出,運算的思路較為簡便。

                    實現: 總而言之,就是先對數據集進行降序排列,再利用Top N的方式,將排序比重最大的元素輸出。
                         先在main()方法中設置傳入和傳出文件的路徑等信息,此處為了統計的便捷性,輸入的結果為Quarterly_wage_everyone輸出的內容。SortIntValueMapper類的map()方法將數據集分行,過濾掉尾部空符后轉類型,再將分割數據傳入下一層。SortIntValueReduce類的reduce()方法對數據單元進行元素自循環,通過定義的Text result變量set()一下toString()的單元素,到此可將處理的數據傳出reduce層。到此第一遍運算結束,程序自動進入第二遍處理,即加載Top N過濾。第二遍的運算輸入為第一次輸出的內容,同時在main()中預加載相應的模塊元素,如:指定job的MapperClass為KMap、job的ReducerClass為KReduce;等。顯而易見,程序進入KMap層進行map運算,再進行KReduce的reduce運算,具體請詳見Quarterly_name_maxwage源碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM