在Excel 中解析通话记录统计

现在假设数据存在于Excel 文件中。具体的实现方案为:

1、添加POI 解析Excel文件。

2、通过实现FileInputFormat 自定义文件输入流。

3、可以通过文件分片将不同的输出输出到不同的目录下。

4、最后将需要的包一并打包到!/some.jar/lib 目录下。最后的项目结构如图所示:

Excel 的文件格式如图5.2.2 所示:

上图的通讯记录(可以自行去移动或是联通的网上营业厅下载通讯记录的Excel 文件),为联通电话的通讯记录。可以自己通过联通或是移动的官方网站上下载自己手机的通话记录详单进行分析即可。

步1:添加依赖:作用是解析excel表格
<dependency>

<groupId>org.apache.poi</groupId>

<artifactId>poi</artifactId>

<version>3.16</version>

</dependency>

步2、开发JavaBean

通过实现接口WritableComparable 可以实现序列化和排序的功能。

package cn.hadoop.excel;

java.io.DataInput;

import java.io.DataOutput;

import java.io.IOException;

import org.apache.hadoop.io.WritableComparable;

public class PhoneBean implements WritableComparable<PhoneBean> {

private String tel;// 电话号码

private String type;// 类型,主叫或是被叫

private Long seconds;

private String fileName;//根据文件名进行分组

//其他方法略去....

}

步3、开发文件解析对象

这个解析类,只是一个独立的类,主要用于读取excel 文件,并从中读取数据。

package cn.hadoop.excel;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.Row;

public class ExcelParser {

/** 接收InputStream 返回解析的结果*/

public static List<PhoneBean> parse(InputStream in,String fileName) {

List<PhoneBean> list = new ArrayList<PhoneBean>();

HSSFWorkbook book = null;

try {

book = new HSSFWorkbook(in);

HSSFSheet sheet = book.getSheetAt(0);

Iterator<Row> it = sheet.iterator();

while (it.hasNext()) {

// 如果还有下一个

Row row = it.next();

String tel = row.getCell(5).getStringCellValue();

if (!tel.matches("\\d+")) {

continue;// 如果不是数字则下一个

}

String times = row.getCell(3).getStringCellValue();

Long time = parse(times);// 转成秒

String type = row.getCell(4).getStringCellValue();

PhoneBean bean = new PhoneBean(tel, type, time);

bean.setFileName(fileName);

list.add(bean);

}

} catch (Exception e) {

throw new RuntimeException(e);

} finally {

try {

book.close();

} catch (IOException e) {

e.printStackTrace();

}

}

return list;

}

/** 将:2 分40 秒转成160 秒<br>*/

public static Long parse(String time) {

Long times = 0L;

if (time.contains("分")) {

String min = time.substring(0, time.indexOf("分"));

times += Long.parseLong(min) * 60;

time = time.substring(time.lastIndexOf("分") + 1);

}

String ss = time.substring(0, time.length() - 1);

times += Long.parseLong(ss);

return times;

}

/**将秒转成分种*/

public static String parse(Long times){

String str = "";

if(times>(60*60)){

Long _times = times/(60*60);

str=_times+"时";

times=times%(60*60);

}

if(times>60){

Long _times=times/60;

str=str+_times+"分";

times=times%60;

}

str=str+times+"秒";

return str;

}

}

步4、开发ExcelFileInputFormat

这个类输出的数据, 就是Mapper 接收的数据类型。注意观察

FileInputFormat<PhoneBean,NullWritable>

/**用于从Excel 中解析数据<br>*/

public class ExcelFileInputFormat extends FileInputFormat<PhoneBean,

NullWritable> {

/** 读取文件*/

public RecordReader<PhoneBean, NullWritable>

createRecordReader(InputSplit split, TaskAttemptContext context)

throws IOException, InterruptedException {

return new ExcelRecordReader();

}

class ExcelRecordReader extends RecordReader<PhoneBean, NullWritable> {

private List<PhoneBean> list;

private int size;

private int index = -1;

private PhoneBean bean = new PhoneBean();

private InputStream in;

/** 分片读取数据*/

public void initialize(InputSplit split, TaskAttemptContext context)

throws IOException, InterruptedException {

FileSplit fs = (FileSplit) split;

FileSystem fs2 =

FileSystem.get(context.getConfiguration());

in = fs2.open(fs.getPath());

String fileName =

fs.getPath().toString();// hdfs://server:port/a.txt

fileName =

fileName.substring(fileName.lastIndexOf("/") + 1);

list = ExcelParser.parse(in,fileName);// 解析xml 文件

size = list.size();

}

public boolean nextKeyValue() throws IOException,

InterruptedException {

index++;

if (index < list.size()) {

return true;

}

return false;

}

public PhoneBean getCurrentKey() throws IOException,

InterruptedException {

return list.get(index);

}

public NullWritable getCurrentValue() throws IOException,

}

public PhoneBean getCurrentKey() throws IOException,

InterruptedException {

return list.get(index);

}

public NullWritable getCurrentValue() throws IOException,

步5、开发主类及Mapper 和Reducer

这儿开发的Mapper 和Reducer 与之前的一样,只是Mapper 中接收到的Key 和value

为InputFormart 输出的Key 和value,请稍加注意。

public class ExcelParserMain {

public static void main(String[] args) throws Exception {

Configuration config = new Configuration();

Job job = Job.getInstance(config);

job.setJarByClass(ExcelParserMain.class);

job.setMapperClass(ExcelMapper.class);

job.setMapOutputKeyClass(Text.class);

job.setMapOutputValueClass(PhoneBean.class);

FileInputFormat.setInputPaths(job, new Path(args[0]));

job.setReducerClass(ExcelReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(Text.class);

FileOutputFormat.setOutputPath(job, new Path(args[1]));

job.setInputFormatClass(ExcelFileInputFormat.class);

job.setPartitionerClass(ExcelFileNamePartitioner.class);

job.setNumReduceTasks(3);

job.waitForCompletion(true);

}

public static class ExcelMapper extends Mapper<PhoneBean,

NullWritable, Text, PhoneBean> {

private Text key2 = new Text();

private LongWritable times = new LongWritable();

public void map(PhoneBean key, NullWritable value,

Mapper<PhoneBean, NullWritable, Text, PhoneBean>.Context context)

throws IOException, InterruptedException {

String key2 = key.getTel() + ":" + key.getType();

this.key2.set(key2);

times.set(key.getSeconds());

context.write(this.key2, key);// 组成:xxxxxx 主叫

}

}

public static class ExcelReducer extends Reducer<Text,PhoneBean,Text,Text> {

private Text value4 = new Text();

protected void reduce(Text text, Iterable<PhoneBean> it,

Reducer<Text, PhoneBean, Text, Text>.Context context)

throws IOException, InterruptedException {

Long sum = new Long(0);

for (PhoneBean bean : it) {

sum+=bean.getSeconds();

}

//将秒转换

String str = ExcelParser.parse(sum);

value4.set(str);

context.write(text, value4);

}}}

步6、打包运行

由于poi.jar 并不是hadoop 的包,所以,可以先将项目打成jar 包,然后在包里

面创建一个lib 目录,并将poi.jar 放到这个目录里面即可。

可以将some.xls 即获取到的excel 文件上传到hdfs 然后执行以下命令,执

行mapreduce 任务:

命令:

$ hadoop jar phonedata.jar /a.xls /out

hadoop操作excel表格相关推荐

  1. python excel操作单元格_python 操作excel表格的方法

    说明:由于公司oa暂缺,人事妹子在做考勤的时候,需要通过几个excel表格去交叉比对员工是否有旷工或迟到,工作量大而且容易出错. 这时候it屌丝的机会来啦,花了一天时间给妹子撸了一个自动化脚本. 1. ...

  2. 使用VC来操作Excel表格的源码

    下面的代码段是关于使用VC来操作Excel表格的的代码,应该对小伙伴们也有用. if (CoInitialize(NULL) != 0) { AfxMessageBox("初始化COM支持库 ...

  3. python 编辑excel需要什么包_Python 中操作EXCEL表格的包

    今天,马云爸爸又来贡献金句了,比王健林公公一亿一个小目标还高,"一个月挣一二十个亿很难受!!!",作为在传统企业主要为电商部门提供数据分析的数据分析师,体验太深刻了. 双11前后, ...

  4. android jxl.jar 使用,使用jxl.jar在Android中操作Excel表格——重中之重——对隐藏表的处理...

    曾简单了解过C#,将Excel(数据库表)表中的数据导入到C#中,使用C#制作的图形化界面进行对Excel表中数据进行操作. 今天想试试,在Android中导入Excel表格进行操作.在网上查阅资料, ...

  5. 【web开发】☆★之利用POI操作Excel表格系列教程【6】遍历工作簙行和列取值

    [web开发]☆★之利用POI操作Excel表格系列教程[6]遍历工作簙行和列取值 package com.xiaoye.demo; import java.io.FileInputStream; i ...

  6. Python操作Excel表格(二)

    Python操作Excel表格第二弹 本博客在前一篇博客基础上增加了若干函数,如按列寻找值,查重和增强型查重.数据写入等相关代码.实现了类似Sql的查询(注解中的SQL语句仅做参考,并非可执行SQL) ...

  7. java操作excel方法_Java实现操作excel表格的方法

    Java开发人员开发的项目需要自动读取数据,其实我们还需要用程序处理Excel数据表,接下来爱站技术频道小编就为大家讲解Java实现操作excel表格的方法吧! 一:查 (查找本地指定位置的excel ...

  8. python openpyxl操作Excel表格

    原创:未经允许不得转载,转载需标明出处 打算分为两个部分: 第一部分为:操作Excel表格 第二部分为:操作Excel图表 现在发布为第一部分内容 在最近的项目中的使用到了提取Android帧率日志, ...

  9. python操作xls_python操作excel表格的方法

    这篇文章我们来讲一下在网站建设中,python操作excel表格的方法.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 说明:由于公司oa暂缺,人事妹子在做考勤的时候,需要通 ...

最新文章

  1. 数据结构与算法:17 图
  2. 年度书单盘点 | “裁员潮”持续蔓延?职场没有铁饭碗,只有硬技能
  3. jQuery开发技巧
  4. (JAVA学习笔记) 关于i++和++i的区别
  5. java xml dom getelementbyid,DOM中常见的元素获取方式
  6. 数据结构--散列表 Hash Table
  7. struts2 redirect 获取参数null_社会化登录支持授权域以便于获取更大权限
  8. 【易语言】飞龙の皮肤模块
  9. python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)
  10. V5-SP6:iocomp-32/iocomp-64-crack-免安装
  11. Matlab关于转置与共轭转置
  12. eyoucms破解授权
  13. win7计算机打开显卡设置在哪,Win7显卡设置在哪里 win7系统如何设置显卡
  14. 四川麻将java_四川麻将纯AI算法------最优拆牌
  15. 简明扼要理解YOLOX
  16. 阿里云又送Apsara定制T恤了 – 附答案
  17. 瓢城旅行社网页界面设计(HTML+CSS)
  18. mysql逻辑结构博客_mysql梳理2
  19. 认识柯里化函数及其应用
  20. 经典的shell十三问

热门文章

  1. Python 数据合并方法 —— Pandas concat() 详解
  2. 测多少数据量?几个G?多少reads?如何换算?
  3. 全球及中国智慧校园行业竞争格局与发展态势展望报告2022-2028年版
  4. 车辆购置税二维条码申报在大连市试点运行
  5. 2021年P气瓶充装新版试题及P气瓶充装试题及解析
  6. 小型继电器的使用及proteus仿真
  7. 这样 PDF 的技术简历,HR 根本不想看!
  8. java字符与ASCII码相互转换
  9. 保险极客发布新品,保险科技正在怎样改变保险业?
  10. 保险业务与系统——2019中国保险科技发展白皮书(摘要)