hadoop分类输出
import org.apache.hadoop.io.Text;
import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.ContextFactory;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.MapFileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.util.Progressable;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
public class MultiFileOut extends Configured implements Tool {
private final static String[] Shengarry = { "北京", "天津", "山西", "内蒙古", "辽宁",
"吉林", "黑龙江", "上海", "江苏", "浙江", "安徽", "福建", "江西", "山东", "河南", "湖北",
"湖南", "广东", "广西", "海南", "重庆", "四川", "贵州", "云南", "西藏", "陕西省", "甘肃",
"青海", "宁夏", "新疆", "河北" };
private final static String[] sexary = { "M", "F" };
public static String getPinYin(String src) {
char[] srcary = null;
srcary = src.toCharArray();
String[] strtmp = new String[srcary.length];
// 设置汉字拼音输出的格式
HanyuPinyinOutputFormat formatstr = new HanyuPinyinOutputFormat();
formatstr.setCaseType(HanyuPinyinCaseType.LOWERCASE);
formatstr.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
formatstr.setVCharType(HanyuPinyinVCharType.WITH_V);
String resultstr = "";
int t0 = srcary.length;
try {
for (int i = 0; i < t0; i++) {
// 判断能否为汉字字符
if (Character.toString(srcary[i]).matches("[\\u4E00-\\u9FA5]+")) {
strtmp = PinyinHelper.toHanyuPinyinStringArray(srcary[i],
formatstr);// 将汉字的几种全拼都存到t2数组中
resultstr += strtmp[0];// +" ";// 取出该汉字全拼的第一种读音并连接到字符串t4后
} else {
// 如果不是汉字字符,间接取出字符并连接到字符串t4后
resultstr += Character.toString(srcary[i]);
}
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
return resultstr;
}
private static class ProvinceMapper extends
Mapper<Object, Text, Text, Text> {
@Override
protected void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
String str = value.toString();
String outkey = "";
Boolean isfind = false;
if (str.indexOf("name") >= 0)
return;
String[] strArray = str.split(",");
if (strArray.length != 33)
return;
String sex = strArray[5];
String addr = strArray[7];
for (int i = 0; i < Shengarry.length; i++) {
for (int j = 0; j < sexary.length; j++) {
int index = addr.indexOf(Shengarry[i]);
if ((index >= 0) && (index <= 3)
&& (sex.indexOf(sexary[j]) >= 0)) {
isfind = true;
outkey = getPinYin(Shengarry[i]) + sexary[j];
break;
}
}
if (isfind)
break;
}
if (isfind) {
context.write(new Text(outkey), value);
} else {
System.out.println("Error Data" + value.toString());
}
}
}
private static class ProvinceReducer extends
Reducer<Text, Text, NullWritable, Text> {
private MultipleOutputs mos = null;
@Override
protected void setup(Context context) throws IOException,
InterruptedException {
mos = new MultipleOutputs(context);
}
@Override
protected void cleanup(Context context) throws IOException,
InterruptedException {
mos.close();
}
@Override
protected void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
Text value = new Text("");
String valuetmp = "";
for (Text va : values) {
value.set(va.toString());
try {
mos.write(key.toString(), NullWritable.get(), value);
} catch (Exception e) {
//System.out.println("Exception" + key);
}
}
}
}
public static void main(String[] args) throws Exception {
ToolRunner.run(new Configuration(), new MultiFileOut(), args);
}
@Override
public int run(String[] args) throws Exception {
int result = 0;
Configuration conf = new Configuration();
String[] argArray = new GenericOptionsParser(conf, args)
.getRemainingArgs();
if (argArray.length != 2) {
System.err.println("Usage: MultiFileOut <in> <out>");
System.exit(1);
}
Job job = new Job(conf, "MultiFileOut");
job.setJarByClass(MultiFileOut.class);
job.setMapperClass(ProvinceMapper.class);
job.setReducerClass(ProvinceReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(Text.class);
// job.setOutputFormatClass(WordCountOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(argArray[0]));
FileOutputFormat.setOutputPath(job, new Path(argArray[1]));
for (int i = 0; i < Shengarry.length; i++) {
for (int j = 0; j < sexary.length; j++) {
MultipleOutputs.addNamedOutput(job, getPinYin(Shengarry[i])
+ sexary[j], TextOutputFormat.class, Text.class,
Text.class);
}
}
try {
result = job.waitForCompletion(true) ? 0 : 1;
} catch (ClassNotFoundException | InterruptedException e) {
e.printStackTrace();
}
return result;
}
}
hadoop分类输出的更多相关文章
- mysql 如何在访问某张数据表按照某个字段分类输出
也许大家有时候会遇到需要将把数据库中的某张表的数据按照该表的某个字段分类输出,比如一张数据表area如下 我们需要将里面的area按照serialize字段进行分类输出,比如这种形式: areas ...
- 微软BI 之SSIS 系列 - 在 SSIS 中将指定目录下的所有文件分类输出到不同文件夹
开篇介绍 比如有这样的一个需求,旧的一个业务系统通常将产出的文件输出到同一个指定的目录下的不同子目录,输出的文件类型有 XML,EXCEL, TXT 这些不同后缀的文件.现在需要在 SSIS 中将它们 ...
- log4j 分类输出
一个log4j的问题也是折磨了我两天了. 终于算是实现了个符合需求的小demo.然而,我必须吧log4j搞定,这个乐塞. 需求描述: 用xml配置文件,将debug.info.warn.error分类 ...
- hadoop MapReduce —— 输出每个单词所对应的文件
下面是四个文件及其内容. 代码实现: Mapper: package cn.tedu.invert; import java.io.IOException; import org.apache.had ...
- log4net通过代码控制按分类输出
应用场景: 比如我们系统有5个任务,每个任务都是独立的流程,按照传统的方式这些流程的数据会输出到一起,这无疑给我们排查问题增加了难度,因为我们需要的是每一个任务一个独立的输出文件,比如任务A输出到lo ...
- logback怎么写?分类输出日志到不同的文件
此appender有顺序,最好不要乱调顺序,输出日志如下: drwxr-xr-x 2 root root 4096 Dec 3 00:00 2019-12-02drwxr-xr-x 2 root ro ...
- Hadoop概念学习系列之为什么hadoop/spark执行作业时,输出路径必须要不存在?(三十九)
很多人只会,但没深入体会和想为什么要这样? 拿Hadoop来说,当然,spark也一样的道理. 输出路径由Hadoop自己创建,实际的结果文件遵守part-nnnn的约定. 如何指定一个已有目录作为H ...
- hadoop 输出中文乱码问题
本文转载至: http://www.aboutyun.com/thread-7358-1-1.html hadoop涉及输出文本的默认输出编码统一用没有BOM的UTF-8的形式,但是对于中文的输出wi ...
- PHP无限级分类的实现(不使用递归)
无限级分类在开发中经常使用,例如:部门结构.文章分类.无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在 ...
随机推荐
- js和jq中常见的各种位置距离之offset和offset()的区别(三)
offsetLeft:元素的边框的外边缘距离与已定位的父容器(offsetparent)的左边距离(不包括元素的边框和父容器的边框). offset().left:返回的是相对于当前文档的坐标,使用o ...
- Fortran和C的编译器PGI部署
平台信息 Description: CentOS Linux release 7.6.1810 (Core) 安装步骤 获取PGCC:社区版是免费的,自带license.dat 解压下载的压缩包:ta ...
- 源码剖析Linux epoll实现机制及Linux上惊群
转载:https://blog.csdn.net/tgxallen/article/details/78086360 看源码是对一个技术认识最直接且最有效的方式了,之前用Linux Epoll做过一个 ...
- 性能测试工具Jmeter03-功能概要
Jmeter工具组成部分 资源生成器:用于生成测试过程中服务器.负载机的资源代码.(LR中的VuGen) 用户运行器:通常是一个脚本运行引擎,根据脚本要求模拟指定的用户行为.(LR中的Controll ...
- contextMenu的使用
contextMenu继承自menu,于是具有menu的一些属性,比如它的add方法,add方法其中的几个参数要注意一些是什么意思:如下图: 第一个groupid顾名思义,组id,如果要把这些item ...
- Murano Weekly Meeting 2016.07.12
Meeting time: 2016.July.12 1:00~2:00 Chairperson: Kirill Zaitsev, from Mirantis Meeting summary: 1. ...
- etc
小小的注意点们 交换两个变量的值时, 如果使用异或运算符, 需要先判断两个数是否相等 if (a == b) return; a ^= b; b = a ^ b; a ^= b; 取一个数组的中间位置 ...
- gdb调试汇总
1. 启动GDB开始调试: (1)gdb program ///最常用的用gdb启动程序,开始调试的方式(2)gdb program core ///用gdb查看core dump文件,跟踪程序cor ...
- td标签里内容不换行
在一些页面开发中,除自己操作外,引起换行的情况一般有: Ex一.td标签里内容长度过长引起换行: Ex二.div标签(或其他标记)里内容有文本和图片引起换行: 解决方法: 针对例子一用<nobr ...
- 随机练习:C#实现维吉尼亚加密与解密(解密前提为已知密匙)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...