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



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

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

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

                                                          
注意事項:考試時間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程序一塊兒計算。spa

 

 

 

 

 

 


解題實現思路:3d

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

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

  3、具體實現思路
          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)的結果先進行排序,再選中最高者輸出,運算的思路較爲簡便。

                    實現: 總而言之,就是先對數據集進行降序排列,再利用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源碼。

相關文章
相關標籤/搜索