Hadoop实战演练:搜索数据分析----数据去重 (1)

         林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

          摘要:本文讲了如何使用hadoop进行数据去重

        工程源码下载:https://github.com/appleappleapple/BigDataLearning/tree/master/Hadoop-Demo

一、环境与数据

1、本地开发环境 

Windows7 + Eclipse Luna

hadoop版本:2.6.2

JDK版本:1.8

2、数据来源:

搜狗实验室

http://www.sogou.com/labs/resource/q.php

3、数据格式

用户ID\t[查询词]\t该URL在返回结果中的排名\t用户点击的顺序号\t用户点击的URL
其中,用户ID是根据用户使用浏览器访问搜索引擎时的Cookie信息自动赋值,即同一次使用浏览器输入的不同查询对应同一个用户ID

样例:

Hadoop实战演练:搜索数据分析----数据去重 (1)_第1张图片

3、数据去重

每一人的同一个搜索关键词能可会有多个点击条数。这里要去除同一个人同一个关键词重复的条数

二、编程实现

package com.lin.keyword;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

/**
 * 功能概要:数据去重
 * 
 * @author linbingwen
 * @since 2016年7月31日
 */
public class CleanSameData {
	// map将输入中的value复制到输出数据的key上,并直接输出
	public static class Map extends Mapper {

		// 实现map函数
        @Override
		public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
			// 将输入的纯文本文件的数据转化成String
			String line = value.toString();
			// 将输入的数据首先按行进行分割
			StringTokenizer tokenizerArticle = new StringTokenizer(line, "\n");
			// 分别对每一行进行处理
			while (tokenizerArticle.hasMoreElements()) {
				// 每行按空格划分
				StringTokenizer tokenizerLine = new StringTokenizer(tokenizerArticle.nextToken());
				String c1 = tokenizerLine.nextToken();//
				String c2 = tokenizerLine.nextToken();// 关键词
				c2 = c2.substring(1, c2.length() - 1);
				Text newline = new Text(c1 + "    " + c2);
				context.write(newline, new Text(""));
			}

		}

	}

	// reduce将输入中的key复制到输出数据的key上,并直接输出
	public static class Reduce extends Reducer {
		// 实现reduce函数
        @Override
		public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
			context.write(key, new Text(""));
		}
	}

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

		Configuration conf = new Configuration();
		// 设置hadoop的机器、端口
		conf.set("mapred.job.tracker", "10.75.201.125:9000");
		// 设置输入输出文件目录
		String[] ioArgs = new String[] { "hdfs://hmaster:9000/data_in", "hdfs://hmaster:9000/clean_same_out" };
		String[] otherArgs = new GenericOptionsParser(conf, ioArgs).getRemainingArgs();
		if (otherArgs.length != 2) {
			System.err.println("Usage:   ");
			System.exit(2);
		}
		// 设置一个job
		Job job = Job.getInstance(conf, "clean same data");
		job.setJarByClass(CleanSameData.class);

		// 设置Map、Combine和Reduce处理类
		job.setMapperClass(Map.class);
		job.setCombinerClass(Reduce.class);
		job.setReducerClass(Reduce.class);

		// 设置输出类型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);

		// 将输入的数据集分割成小数据块splites,提供一个RecordReder的实现
		job.setInputFormatClass(TextInputFormat.class);

		// 提供一个RecordWriter的实现,负责数据输出
		job.setOutputFormatClass(TextOutputFormat.class);

		// 设置输入和输出目录
		FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
		System.exit(job.waitForCompletion(true) ? 0 : 1);

	}

}
maven文件:


	4.0.0
	com.lin
	zdy-hadoop
	0.0.1-SNAPSHOT
	
		
		4.3.0.RELEASE
		
		1.6.6
		1.2.12
		
		4.12
		2.6.0
		
		3.2.1
		6.0.3
	

			
		
		
			junit
			junit
			${junit.version}
			test
		
		
		
			log4j
			log4j
			${log4j.version}
		
		
			org.slf4j
			slf4j-api
			${slf4j.version}
		
		
			ch.qos.logback
			logback-classic
			1.1.2
		
		
			ch.qos.logback
			logback-core
			1.1.2
		
		
			org.logback-extensions
			logback-ext-spring
			0.1.1
		
		
			org.apache.hadoop
			hadoop-common
			2.6.0
		
		
			org.apache.hadoop
			hadoop-hdfs
			2.6.0
		
		
			org.apache.hadoop
			hadoop-client
			2.6.0
		
		
			jdk.tools
			jdk.tools
			1.8
			system
			${JAVA_HOME}/lib/tools.jar
		
	     
		
			mysql
			mysql-connector-java
			${mysql.connect.version}
		
	

	
		zdy-hadoop
		
		    
			src/main/resources/env/${env}.properties
		
		
		
			
				src/main/resources
				${basedir}/target/classes
				
					**/*.properties
					**/*.xml
				
				true
			
			
				src/main/resources
				${basedir}/target/resources
				
					**/*.properties
					**/*.xml
				
				true
			
		

		
		
			
				org.apache.maven.plugins
				maven-compiler-plugin
				2.0.2
				
					1.8
					1.8
					UTF-8
				
			
			
				org.apache.maven.plugins
				maven-jar-plugin
				
					
					
						prepare-package
						
							jar
						
						
							
								com/**
							
						
					
				
			
			
				maven-assembly-plugin
				
					
					false
					${project.artifactId}
					
						src/main/assemble/assembly.xml
					
				
				
					
						make-assembly
						package
						
							single
						
					
				
			
	
	
	
		
		
			dev
			
				true
			
			
				dev
			
		
	


输出结果:

Hadoop实战演练:搜索数据分析----数据去重 (1)_第2张图片


你可能感兴趣的:(Hadoop实战演练,hadoop,数据去重)