java 从hadoop hdfs读取文件 进行groupby并显示为条形图
2017-05-21 01:11
447 查看
题意:从文件、网络或者数据库中读取数据(格式自定、数据自定),显示统计结果(包括图形两种以上),用户界面自定
有兴趣使用的,请点源代码与数据下载链接
示例:第一行如下
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:
1.3 读取数据
使用hdfs的API读取数据流,in.readline为按行读取数据。
“hdfs://localhost:9000/文件路径”为hadoop中地址,需要与${HADOOP_HOME}/etc/Hadoop/core-site.xml设置文件中保持一致
本工程分别对分组数据进行count,求平均avg,求最大值max处理,所以hashtable中键为分组统计的关键字,值有三个,所以此处自定义一个class,便于构建一键多值的hashtable.
2.2 groupby分组处理数据
初始化
将键为key,值为hw2的值put到hashtable中
其中avg_now,max_now为第一次出现key时的相应列的值,
使用迭代器对hashtable中的值进行遍历,使用iterator0.hasNext()判断迭代是否完成,next()为迭代器遍历下一个关键字的方法。htable.get(key)为得key值对应的value,对value.avg平均数取小数点后两位
System.out.println(“ ”)打印出统计结果
3.2 柱状图显示数据
收集数据集
将上述统计的来的数据使用CategoryDataset包装在一起,返回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,以及表头
输出:
统计数据
显示数据
编译运行
目录
UML 图
有兴趣使用的,请点源代码与数据下载链接
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<
4000
span class="hljs-preprocessor">.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 图
UML 图:
Created with Raphaël 2.1.0hadoop hdfshadoop hdfsjava编辑器java编辑器文字和图形显示(Xming)文字和图形显示(Xming)读取数据groupby 得到count、avg、max相关文章推荐
- 4000 hadoop入门(三)之 javaAPI操作Hdfs,进行文件操作
- Hadoop实验:用java把hdfs系统里的文件内容读取出来,显示到屏幕
- win7环境Eclipse中运行JAVA项目读取HDFS(hadoop-2.7.2)中的文件实例(2)
- win7环境Eclipse中运行JAVA项目读取HDFS(hadoop-2.7.2)中的文件实例与问题汇总
- Hadoop学习笔记——1.java读取Oracle中表的数据,创建新文件写入Hdfs
- Hadoop java实现读取hdfs文件
- java 读取文件并显示
- JAVA读取XML文件并利用该文件对数据库进行配置操作
- Hadoop HDFS文件操作 Java实现类
- Java读取本地文件,并显示在JSP文件中
- java遍历文件夹读取文件进行处理
- Hadoop HDFS文件操作 Java实现类
- 利用java操作Hadoop文件 /hdfs
- java读取文件数据进行一些简单处理的例子
- java 将对象写入文件进行保存和读取
- Java读取本地文件,并显示在JSP文件中
- java读取excel、txt 文件内容,传到、显示到另一个页面的文本框里面。
- java 解析jar 文件,读取并进行调用
- 云计算学习笔记004---hadoop的简介,以及安装,用命令实现对hdfs系统进行文件的上传下载
- hadoop读取文件java.io.EOFException解决