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 圖:
相關推薦
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
Java從web伺服器下載檔案到本地
/*從伺服器中下載檔案到本地*/ /*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