Hadoop MapReduce纵表转横表

输入数据如下:以\t分隔

0-3岁育儿百科 书        23
0-5v液位传感器  5
0-5轴承 2
0-6个月奶粉     23
0-6个月奶粉c2c报告      23
0-6个月奶粉在线购物排名 23
0-6个月奶粉市场前景     23
0-6个月配方奶粉 23
0.001g电子天平  5
0.01t化铝炉     2
0.01吨熔铝合金炉        2
0.03吨化镁炉    25
0.03吨电磁炉    11

其中左侧是搜索词,右侧是类别,可看成是数据库中的纵表,现需要将输入转成横表,即 类名\t语句1\t语句2...,这样的格式。

MapReduce最适合做这样的事情了。因为经常用到,记录一下。Hive表中的数据要转成横表的时候,单独写个MR来处理就很方便了。

package seg;

import java.io.IOException;

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.LongWritable;
import org.apache.hadoop.io.Text;
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.util.GenericOptionsParser;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

/**
 * @author zhf
 * @email [email protected]
 * @version 创建时间:2014年8月24日 上午9:56:45
 */
public class Vertical2Horizontal extends Configured implements Tool{
	public static void main(String[] args) throws Exception {
		int exitCode = ToolRunner.run(new Vertical2Horizontal(), args);
		System.exit(exitCode);
	}

	@Override
	public int run(String[] arg0) throws Exception {
		String[] args = new GenericOptionsParser(arg0).getRemainingArgs();
		if(args.length != 2){
			System.out.println("Usage:seg.Horizontal2Vertical <input> <output>");
			System.exit(1);
		}
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(conf);
		if(fs.exists(new Path(args[1])))
			fs.delete(new Path(args[1]),true);
		Job job = new Job(conf);
		job.setJarByClass(getClass());
		job.setMapperClass(HVMapper.class);
		job.setReducerClass(HVReducer.class);
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(Text.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		FileInputFormat.addInputPath(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));
		return job.waitForCompletion(true) ? 0:1;
	}

	public static class HVMapper extends Mapper<LongWritable,Text,Text,Text>{
		private Text text = new Text();
		private Text clazz = new Text();
		public void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException{
			String line = value.toString();
			String params[] = line.split("\t");
			text.set(params[0]);
			clazz.set(params[1]);
			context.write(clazz,text);
		}
	}

	public static class HVReducer extends Reducer<Text,Text,Text,Text>{
		private Text result = new Text();
		public void reduce(Text key,Iterable<Text> values,Context context) throws IOException, InterruptedException{
			String tmp = "";
			for(Text val : values){
				tmp += val + "\t";
			}
			result.set(tmp.trim());
			context.write(key, result);
		}
	}

}

输出:

1       莱舍万 服装美学 莱芜劳保服装    南京羽绒服特卖会        螃蟹的秘密品牌内衣店    螃蟹的秘密内衣专卖店
时间: 2024-10-24 14:53:41

Hadoop MapReduce纵表转横表的相关文章

sql_纵表变横表

method certificate value     getUserId 123 getUserid     startTime 123 22     endTime 123 33               如表所示,现在有一个需求,要算getUserId的执行时间,给一个思路,先查询出method=getUserID,和certificate,作为一个结果集,再查出来method=startTime的结果集,然后重新 select from这三个结果集r1,r2,r3, where R1

SQL Server之纵表与横表互转

1,纵表转横表 纵表结构 Table_A: 转换后的结构: 纵表转横表的SQL示例: SELECT  Name ,        SUM(CASE WHEN Course = N'语文' THEN Grade                 ELSE 0            END) AS Chinese ,        SUM(CASE WHEN Course = N'数学' THEN Grade                 ELSE 0            END) AS Math

纵表与横表互转实例(转)

1.纵表转横表: 纵表结构:Table1 转换后的横表结构: Sql示例代码: 1 2 3 4 5 6 7 8 9 10 11 select username, sum(case Course when '语文' then Grade else 0 end) as 语文, sum(case Course when '数学' then Grade else 0 end) as 数学, sum(case Course when '英语' then Grade else 0 end) as 英语 fr

sql 语句纵表变横表

现把转换方法列举如下: 1.纵表转横表: 纵表结构 TableA Name Course Grade 张三 语文 75 张三 数学 80 张三 英语 90 李四 语文 95 李四 数学 55 横表结构 TableB Name 语文 数学 英语 张三 75 80 90 李四 95 55 0 方法一: select Name, sum(case Course when ‘语文‘ then Grade else 0 end) as 语文, sum(case Course when ‘数学‘ then

数据库之横表转纵表、纵表转横表

/*横表变纵表或纵表变横表 成绩表如下 Name Course Grade 张三 语文 95 张三 数学 90 张三 英语 89 李四 语文 92 李四 数学 88 李四 英语 97变成 姓名 语文 数学 英语 张三 95 90 89 李四 92 88 97 */ --纵表转横表 create table biao ( PName varchar(10), PCourse varchar (10), PGrade int ) go insert into biao values('张三','语文

纵表与横表互转实例

1.纵表转横表: 纵表结构:Table1 转换后的横表结构: Sql示例代码: ? 1 2 3 4 5 6 7 8 9 10 11 select username, sum(case Course when '语文' then Grade else 0 end) as 语文, sum(case Course when '数学' then Grade else 0 end) as 数学, sum(case Course when '英语' then Grade else 0 end) as 英语

SQL纵表与横表互转

1.纵表转横表: 纵表结构:Table1 转换后的横表结构: Sql示例代码: select username, sum(case Course when '语文' then Grade else 0 end) as 语文, sum(case Course when '数学' then Grade else 0 end) as 数学, sum(case Course when '英语' then Grade else 0 end) as 英语 from Table1 group by usern

Hadoop MapReduce例子-新版API多表连接Join之模仿订单配货

文章为作者原创,未经许可,禁止转载.    -Sun Yat-sen University 冯兴伟 一.    项目简介: 电子商务的发展以及电商平台的多样化,类似于京东和天猫这种拥有过亿用户的在线购物网站,每天要处理的订单数堪称海量,更别提最近的双十一购物节,如此海量的订单数据阿里巴巴和京东是如何准确将用户信息和其订单匹配并配货的呢?答案是数据连接匹配.我的云计算项目idea也是来源于此.我们在做数据分析时常要连接从不同的数据源中获取到的数据,单机模式下的关系型数据库中我们会遇到这问题,同样在

sql实现纵表变横表

网上所有的纵横表转换都是千篇一律的,参考价值都不大,而且只适合那种数据量固定的学生成绩表的横纵转化,但是当真正遇到大数据量的批量转换的时候是行不通的,下面介绍一种相对灵活的大量数据的横纵表转换: 表结构: 如上图所示,其中index_id中以0结尾的表示的是服务名,以1结尾的表示设备rac名称,2结尾的表示的是设备状态. 下面我们需要将一组0,1,2结尾的分别展示成以服务名,设备rac名称,设备状态为表头的一行数据,多组0,1,2结尾的展示成多行数据. Sql执行如下: select index