1. 程式人生 > >java 從hadoop hdfs讀取檔案 進行groupby並顯示為條形圖

java 從hadoop hdfs讀取檔案 進行groupby並顯示為條形圖

  • 題意:從檔案、網路或者資料庫中讀取資料(格式自定、資料自定),顯示統計結果(包括圖形兩種以上),使用者介面自定

1 讀取資料

1.1 準備資料

此資料為TPCH基準測試集中lineitem.tdl檔案中前25行

示例:第一行如下
1|1552|93|1|17|24710.35|0.04|0.02|N|O|1996-03-13|1996-02-12|1996-03-22|DELIVERIN PERSON|TRUCK|egular courts above the|

其中有15列,分別以“|”隔開

  • 第0列:1
  • 第1列:1552
  • 第2列:93
  • 第n列:…

全部資料截圖如下:
資料截圖

1.2 將資料存入HDFS

:

檔案系統:HDFS全名為hadoop Distributed File System,是google File system的開源實現,是一種基於java的應用層檔案系統,與hadoop捆綁在一起。HDFS設計成能可靠地在叢集中大量機器之間儲存大量的檔案,它以塊序列的形式儲存檔案。
在hadoop叢集開啟的情況下,使用以下命令將資料儲存在hadoop hdfs檔案系統的JVdata資料夾中。
#hadoop fs –copyFromLocal statistics.tbl ./JVdata

1.3 讀取資料

使用hdfs的API讀取資料流,in.readline為按行讀取資料。
“hdfs://localhost:9000/檔案路徑”為hadoop中地址,需要與${HADOOP_HOME}/etc/Hadoop/core-site.xml設定檔案中保持一致

        <property>
             <name>fs.defaultFS</name>
             <value>hdfs://104.128.92.12:9000</value>
        </property>
public class HDFSTest {
public static void main(String[] args) throws IOException, URISyntaxException{
String file= “hdfs://localhost:9000/檔案路徑";
Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(file), conf); Path path = new Path(file); FSDataInputStream in_stream = fs.open(path); BufferedReader in = new BufferedReader(new InputStreamReader(in_stream)); String s; while ((s=in.readLine())!=null) { System.out.println(s); } in.close(); fs.close(); } }

2.統計資料

2.1 使用hashtable鍵值對方法統計資料
本工程分別對分組資料進行count,求平均avg,求最大值max處理,所以hashtable中鍵為分組統計的關鍵字,值有三個,所以此處自定義一個class,便於構建一鍵多值的hashtable.

class Hw1{
    public int count ;
    public double avg;
    public double max;
    public Hw1(int count,double avg,double max){
        this.count=count;
        this.avg=avg;
        this.max=max;
    }
    public int hashCode(){
       return (String.valueOf(count)+String.valueOf(avg)+String.valueOf(max)).hashCode();
    }
    public String toString(){
        return String.valueOf(count)+String.valueOf(avg)+String.valueOf(max);
    }
}

2.2 groupby分組處理資料

分別對三種目標結果進行計算統計,依次處理每行的資料,將行累加或者求最大。其中word為字串型別的陣列,將元資料用“|”分割,使用下標法對陣列取值。

初始化

Hw1 hw2 = new Hw1(1,avg_now,max_now);
htable.put(key,hw2);

將鍵為key,值為hw2的值put到hashtable中
其中avg_now,max_now為第一次出現key時的相應列的值,

 Hashtable<String, Hw1> htable = new Hashtable<String,Hw1>();
        while ((s=in.readLine())!=null ) {
            String[] words = s.split("\\|");
            String key = words[group];
            double max_now=Double.valueOf(words[Integer.valueOf(command2.substring(command2.length()-2,command2.length()-1))]);
            double avg_now=Double.valueOf(words[Integer.valueOf(command1.substring(command1.length()-2,command1.length()-1))]);
            if(htable.containsKey(key)){
                Hw1 value=htable.get(key);
                value.count=value.count+1;
                if(max_now>=value.max ){
                        value.max=max_now;
                }
                value.avg=value.avg+avg_now;
                htable.put(key, value);
            }else {
                Hw1 hw2 = new Hw1(1,avg_now,max_now);
                htable.put(key,hw2);
            }

3.顯示資料

3.1 列印資料
使用迭代器對hashtable中的值進行遍歷,使用iterator0.hasNext()判斷迭代是否完成,next()為迭代器遍歷下一個關鍵字的方法。htable.get(key)為得key值對應的value,對value.avg平均數取小數點後兩位
System.out.println(“ ”)打印出統計結果


Iterator<String> iterator0 = htable.keySet().iterator();
while(iterator0.hasNext()){
            String key = (String)iterator0.next();
            Hw1 value0 = htable.get(key);
            value0.avg=value0.avg/value0.count;

            BigDecimal b   =   new  BigDecimal(value0.avg);
            value0.avg=   b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
          System.out.println("keySet:"+key+" "+value0.count+" "+value0.avg+" "+value0.max);
}

3.2 柱狀圖顯示資料

使用switch-case語句,將hashtable中統計的平均資料,傳給相應變數,然後使用第三方包實現柱狀圖的繪製

收集資料集

將上述統計的來的資料使用CategoryDataset包裝在一起,返回dataset便於畫圖使用。

private static CategoryDataset getDataSet(double Type1,double Type2,double Type3,double Type4,double Type5,double Type6,double Type7) {  
           DefaultCategoryDataset dataset = new DefaultCategoryDataset();  
           dataset.addValue(Type1, "Type1", "Type1");  
           dataset.addValue(Type2, "Type2", "Type2");  
           dataset.addValue(Type3, "Type3", "Type3");  
           dataset.addValue(Type4, "Type4", "Type4");  
           dataset.addValue(Type5, "Type5", "Type5"); 
           dataset.addValue(Type6, "Type6", "Type6");  
           dataset.addValue(Type7, "Type7", "Type7");           
return dataset;  
}

輸出:
keySet:6 count: 1 avg: 48040.43 max: 48040.43
keySet:5 count: 3 avg: 36098.98 max: 63818.5
keySet:4 count: 1 avg: 53456.4 max: 53456.4
keySet:3 count: 6 avg: 36405.1 max: 53468.31
keySet:2 count: 1 avg: 36596.28 max: 36596.28
keySet:1 count: 6 avg: 30122.44 max: 56688.12
keySet:7 count: 7 avg: 40209.09 max: 85051.24
finish it ! The size of htable is 7
這裡寫圖片描述

設定橫座標,縱座標和label,以及表頭

public ChartPanel getChartPanel(double Type1,double Type2,double Type3,double Type4,double Type5,double Type6,double Type7){  
   CategoryDataset dataset = getDataSet(Type1,Type2,Type3,Type4,Type5,Type6,Type7);  
        JFreeChart chart = ChartFactory.createBarChart3D(  
                             "Statistical Graph", 
                            "category",
                            "number", 
                            dataset, 
                            PlotOrientation.VERTICAL,  
                            true,          
                            false,         
                            false          
                            );       
        CategoryPlot plot=chart.getCategoryPlot();  
        CategoryAxis domainAxis=plot.getDomainAxis();          
        ValueAxis rangeAxis=plot.getRangeAxis();
         frame1=new ChartPanel(chart,true);        
    return frame1;        
}  
}

輸出:

這裡寫圖片描述

4 編譯執行:

/root/jars/jfreechart-1.0.13/lib為外部包路徑,JavaChart.java為主函式,會產生多個class,但是JavaChart為主要class. -Djava.ext.dirs為載入第三方包,此處為包的路徑
#vim JavaChart.java
#javac -Djava.ext.dirs=./jfreechart-1.0.13/lib JavaChart.java
#java -Djava.ext.dirs=./jfreechart-1.0.13/lib JavaChart

目錄

UML 圖:

Created with Raphaël 2.1.0hadoop hdfshadoop hdfsjava編輯器java編輯器文字和圖形顯示(Xming)文字和圖形顯示(Xming)讀取資料groupby 得到count、avg、max

相關推薦

java hadoop hdfs讀取檔案 進行groupby顯示條形

題意:從檔案、網路或者資料庫中讀取資料(格式自定、資料自定),顯示統計結果(包括圖形兩種以上),使用者介面自定 1 讀取資料 1.1 準備資料 此資料為TPCH基準測試集中lineitem.tdl檔案中前25行 示例:第一行如下 1|1

Java資料庫中讀取Blob物件圖片顯示

import java.sql.*; import java.io.*;   import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.awt.image.AffineTransformOp; import j

java jar中讀取檔案 三種方法

Sample1-利用Manifest檔案讀取jar中的檔案 1.檔案目錄 test--      --a.text      --b.gif 2. Menifest檔案內容: Manifest-Version: 1.0 abc: test/a.txt iconname: t

Servlet本機讀取一個圖片,顯示在html頁面

1、工具類 //工具類 package com.JavaBean; import java.awt.image.BufferedImage; import java.io.FileInputStream; impo

資料庫中讀取多張圖片顯示在同一頁面中

一開始想的是while(rs.next())迴圈讀取每張圖片並直接儲存在session中,傳到InputStream中,形成一張張圖片,後來發現InputStream物件被覆蓋了,意思是在同一頁面中顯

minio中讀取檔案進行下載檔案

一、獲取Minio連線     public static String minioUrl;         public static String minioUsername;    

hdfs讀取檔案出發java.io.EOFException異常

[2014-05-05 17:42:51] [main] DEBUG - Error making BlockReader. Closing stale NioInetPeer(Socket[addr=/XXXXX,port=50010,localport=55897])  java.io.EOFExcep

kafka-connect-hdfs重啟,進去RECOVERY狀態,hadoop hdfs拿租約,很正常,但是也太久了吧

not handle 個人 ret sun response sass pre sub 雖說這個算是正常現象,等的時間也太久了吧。分鐘級了。這個RECOVERY裏面的WAL有點多余。有這麽久的時間,早從新讀取kafka寫入hdfs了。純屬個人見解。 @SuppressWa

java使用FileUtils 對json檔案進行讀寫

package com.dl.utils; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; public class GetPutItems { //寫

java程式碼實現根據JSON檔案進行批量檔案重新命名或者改目錄結構

使用JAVA程式碼根據JSON檔案進行批量修改檔名以及路徑 某些網站視訊加密分割,首先去下載格式轉換工具,再用chrome F12開啟控制檯,找到json檔案進行檔案還原 json資料: {“message”:“hello”,“result”:[],“status”:200

Java 指定URL下載檔案儲存到指定目錄

從指定的URL下載檔案,並儲存到本地,近期開發過程中用的這個功能比較多,特此記錄! 1.基本流程 當我們想要下載網站上的某個資源時,我們會獲取一個url,它是伺服器定位資源的一個描述,下載的過程有如下幾步: (1)客戶端發起一個url請求,獲取連線物件。 (2)伺服器解析url,並且

資料夾讀取檔案

// test2.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<vld.h> #include<string> #include&

HDFS讀取檔案詳解

HDFS讀取檔案 客戶端向namenode發出請求下載檔案(呢個路徑下的呢個檔案); namenode經過查詢源資料資訊,哦,發現有請求需要的資訊,然後將目標檔案的元資料返回給client,元資料包扣檔案儲存在呢些DataNode下的,呢些block,都會發給client;

Hadoop HDFS分散式檔案系統設計要點與架構

Hadoop簡介:一個分散式系統基礎架構,由Apache基金會開發。使用者可以在不瞭解分散式底層細節的情況下,開發分散式程式。充分利用叢集的威力高速運算和儲存。Hadoop實現了一個分散式檔案系統(Hadoop Distributed File System),簡稱HDFS。HDFS有著高容錯性的特點,並

hadoop HDFS常用檔案操作命令

命令基本格式: hadoop fs -cmd < args > 1.ls hadoop fs -ls / 列出hdfs檔案系統根目錄下的目錄和檔案 hadoop fs -ls -R / 列出hdfs檔案系統所有的目錄和檔案

類似於c語言讀取檔案進行解析

        $log_file_name = 'D:/static/develop/kuai_zhi/acagrid.com/public/Logs/'.date('Ym').'/'.date('d').'_error.log';            //$log_file_name = '

java一個目錄拷貝檔案到另一個目錄下

** * 複製單個檔案 * @param oldPath String 原檔案路徑 如:c:/fqf.txt * @param newPath String 複製後路徑 如:f:/fqf.txt * @return boolean */ public

Javaweb伺服器下載檔案到本地

/*從伺服器中下載檔案到本地*/ /*url:檔案存放在伺服器的地址;target:要儲存的路徑*/ public String DownloadFile(String url,String target){ URLConnection con=null; URL theUrl=null; try { th

hadoop平臺讀取檔案報錯

背景: 生產環境有個指令碼執行讀取st層表資料時出現IO錯誤,查看錶目錄下的檔案,都是壓縮後的檔案。詳細資訊如下: Task with the most failures(4): ----- Task ID: task_201408301703_172845_m_00350

Hadoop權威指南學習——Hadoop URL讀取資料

一、準備工作         在hadoop-env.sh中配置好 HADOOP_CLASSPATH 變數,值為編譯後的.class檔案所放置的地方。 export HADOOP_CLASSPATH=/usr/software/hadoop/hadoop-2.2.0/cl