hadoop实现购物商城推荐系统

1,商城:是单商家,多买家的商城系统。数据库是mysql,语言java。

2,sqoop1.9.33:在mysql和hadoop中交换数据。

3,hadoop2.2.0:这里用于练习的是伪分布模式。

4,完成内容:喜欢该商品的人还喜欢,相同购物喜好的好友推荐。

步骤:

1,通过sqoop从mysql中将 “用户收藏商品” (这里用的是用户收藏商品信息表作为推荐系统业务上的依据,业务依据可以很复杂。这里主要介绍推荐系统的基本原理,所以推荐依据很简单)的表数据导入到hdfs中。

2,用MapReduce实现推荐算法。

3,通过sqoop将推荐系统的结果写回mysql。

4,java商城通过推荐系统的数据实现<喜欢该商品的人还喜欢,相同购物喜好的好友推荐。>两个功能。

实现:

1,

推荐系统的数据来源:

左边是用户,右边是商品。用户每收藏一个商品都会生成一条这样的信息,<喜欢该商品的人还喜欢,相同购物喜好的好友推荐。>的数据来源都是这张表。

sqoop导入数据,这里用的sqoop1.9.33。sqoop1.9.33的资料很少,会出现一些错误,搜索不到的可以发到我的邮箱[email protected]。

创建链接信息

这个比较简单

创建job

信息填对就可以了

导入数据执行 start job --jid 上面创建成功后返回的ID

导入成功后的数据

2,eclipse开发MapReduce程序

ShopxxProductRecommend<喜欢该商品的人还喜欢>

整个项目分两部,一,以用户对商品进行分组,二,求出商品的同现矩阵。

第1大步的数据为输入参数对商品进行分组

输出参数:

二,以第一步的输出数据为输入求商品的同现矩阵

输出数据

第一列数据为当前商品,第二列为与它相似的商品,第三列为相似率(越高越相似)。

整个过程就完了,下面

package xian.zhang.common;

import java.util.regex.Pattern;

public class Util {
	 public static final Pattern DELIMITER = Pattern.compile("[\t,]");
}
package xian.zhang.core;

import java.io.IOException;
import java.util.Iterator;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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;

/**
 * 将输入数据 userid1,product1  userid1,product2   userid1,product3
 * 合并成 userid1 product1,product2,product3输出
 * @author zx
 *
 */
public class CombinProductInUser {

	public static class CombinProductMapper extends Mapper<LongWritable, Text, IntWritable, Text>{
		@Override
		protected void map(LongWritable key, Text value,Context context)
				throws IOException, InterruptedException {
			String[] items = value.toString().split(",");
			context.write(new IntWritable(Integer.parseInt(items[0])), new Text(items[1]));
		}
	}

	public static class CombinProductReducer extends Reducer<IntWritable, Text, IntWritable, Text>{

		@Override
		protected void reduce(IntWritable key, Iterable<Text> values,Context context)
				throws IOException, InterruptedException {
			StringBuffer sb = new StringBuffer();
			Iterator<Text> it = values.iterator();
			sb.append(it.next().toString());
			while(it.hasNext()){
				sb.append(",").append(it.next().toString());
			}
			context.write(key, new Text(sb.toString()));
		}

	}

	@SuppressWarnings("deprecation")
	public static boolean run(Path inPath,Path outPath) throws IOException, ClassNotFoundException, InterruptedException{

		Configuration conf = new Configuration();
		Job job = new Job(conf,"CombinProductInUser");

		job.setJarByClass(CombinProductInUser.class);
		job.setMapperClass(CombinProductMapper.class);
		job.setReducerClass(CombinProductReducer.class);

		job.setOutputKeyClass(IntWritable.class);
		job.setOutputValueClass(Text.class);

		FileInputFormat.addInputPath(job, inPath);
		FileOutputFormat.setOutputPath(job, outPath);

		return job.waitForCompletion(true);

	}

}
package xian.zhang.core;

import java.io.IOException;
import java.util.Iterator;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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;

/**
 * 将输入数据 userid1,product1  userid1,product2   userid1,product3
 * 合并成 userid1 product1,product2,product3输出
 * @author zx
 *
 */
public class CombinProductInUser {

	public static class CombinProductMapper extends Mapper<LongWritable, Text, IntWritable, Text>{
		@Override
		protected void map(LongWritable key, Text value,Context context)
				throws IOException, InterruptedException {
			String[] items = value.toString().split(",");
			context.write(new IntWritable(Integer.parseInt(items[0])), new Text(items[1]));
		}
	}

	public static class CombinProductReducer extends Reducer<IntWritable, Text, IntWritable, Text>{

		@Override
		protected void reduce(IntWritable key, Iterable<Text> values,Context context)
				throws IOException, InterruptedException {
			StringBuffer sb = new StringBuffer();
			Iterator<Text> it = values.iterator();
			sb.append(it.next().toString());
			while(it.hasNext()){
				sb.append(",").append(it.next().toString());
			}
			context.write(key, new Text(sb.toString()));
		}

	}

	@SuppressWarnings("deprecation")
	public static boolean run(Path inPath,Path outPath) throws IOException, ClassNotFoundException, InterruptedException{

		Configuration conf = new Configuration();
		Job job = new Job(conf,"CombinProductInUser");

		job.setJarByClass(CombinProductInUser.class);
		job.setMapperClass(CombinProductMapper.class);
		job.setReducerClass(CombinProductReducer.class);

		job.setOutputKeyClass(IntWritable.class);
		job.setOutputValueClass(Text.class);

		FileInputFormat.addInputPath(job, inPath);
		FileOutputFormat.setOutputPath(job, outPath);

		return job.waitForCompletion(true);

	}

}
package xian.zhang.core;

import java.io.IOException;

import org.apache.hadoop.fs.Path;

public class Main {

	public static void main(String[] args) throws ClassNotFoundException, IOException, InterruptedException {

		if(args.length < 2){
			throw new IllegalArgumentException("要有两个参数,数据输入的路径和输出路径");
		}

		Path inPath1 = new Path(args[0]);
		Path outPath1 = new Path(inPath1.getParent()+"/CombinProduct");

		Path inPath2 = outPath1;
		Path outPath2 = new Path(args[1]);

		if(CombinProductInUser.run(inPath1, outPath1)){
			System.exit(ProductCo_occurrenceMatrix.run(inPath2, outPath2)?0:1);
		}
	}

}

ShopxxUserRecommend<相同购物喜好的好友推荐>

整个项目分两部,一,以商品对用户进行分组,二,求出用户的同现矩阵。

原理和ShopxxProductRecommend一样

下面附上代码

package xian.zhang.common;

import java.util.regex.Pattern;

public class Util {
	 public static final Pattern DELIMITER = Pattern.compile("[\t,]");
}
package xian.zhang.core;

import java.io.IOException;
import java.util.Iterator;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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;

/**
 * 将输入数据 userid1,product1  userid1,product2   userid1,product3
 * 合并成 productid1 user1,user2,user3输出
 * @author zx
 *
 */
public class CombinUserInProduct {

	public static class CombinUserMapper extends Mapper<LongWritable, Text, IntWritable, Text>{
		@Override
		protected void map(LongWritable key, Text value,Context context)
				throws IOException, InterruptedException {
			String[] items = value.toString().split(",");
			context.write(new IntWritable(Integer.parseInt(items[1])), new Text(items[0]));
		}
	}

	public static class CombinUserReducer extends Reducer<IntWritable, Text, IntWritable, Text>{

		@Override
		protected void reduce(IntWritable key, Iterable<Text> values,Context context)
				throws IOException, InterruptedException {
			StringBuffer sb = new StringBuffer();
			Iterator<Text> it = values.iterator();
			sb.append(it.next().toString());
			while(it.hasNext()){
				sb.append(",").append(it.next().toString());
			}
			context.write(key, new Text(sb.toString()));
		}

	}

	@SuppressWarnings("deprecation")
	public static boolean run(Path inPath,Path outPath) throws IOException, ClassNotFoundException, InterruptedException{
		Configuration conf = new Configuration();
		Job job = new Job(conf,"CombinUserInProduct");

		job.setJarByClass(CombinUserInProduct.class);
		job.setMapperClass(CombinUserMapper.class);
		job.setReducerClass(CombinUserReducer.class);

		job.setOutputKeyClass(IntWritable.class);
		job.setOutputValueClass(Text.class);

		FileInputFormat.addInputPath(job, inPath);
		FileOutputFormat.setOutputPath(job, outPath);

		return job.waitForCompletion(true);

	}

}
package xian.zhang.core;

import java.io.IOException;
import java.util.Iterator;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
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 xian.zhang.common.Util;

/**
 * 用户的同先矩阵
 * @author zx
 *
 */
public class UserCo_occurrenceMatrix {

	public static class Co_occurrenceMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

		IntWritable one = new IntWritable(1);

		@Override
		protected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {

			String[] products = Util.DELIMITER.split(value.toString());
			for(int i=1;i<products.length;i++){
				for(int j=1;j<products.length;j++){
					if(i != j){
						context.write(new Text(products[i] + ":" + products[j]), one);
					}
				}
			}

		}

	}

	public static class Co_occurrenceReducer extends Reducer<Text, IntWritable, NullWritable, Text>{

		NullWritable nullKey =NullWritable.get();

		@Override
		protected void reduce(Text key, Iterable<IntWritable> values,Context context)
				throws IOException, InterruptedException {
			int sum = 0;
			Iterator<IntWritable> it = values.iterator();
			while(it.hasNext()){
				sum += it.next().get();
			}
			context.write(nullKey, new Text(key.toString().replace(":", ",") + "," + sum));
		}

	}

	@SuppressWarnings("deprecation")
	public static boolean run(Path inPath,Path outPath) throws IOException, ClassNotFoundException, InterruptedException{

		Configuration conf = new Configuration();
		Job job = new Job(conf,"UserCo_occurrenceMatrix");

		job.setJarByClass(UserCo_occurrenceMatrix.class);
		job.setMapperClass(Co_occurrenceMapper.class);
		job.setReducerClass(Co_occurrenceReducer.class);

		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(IntWritable.class);

		job.setOutputKeyClass(NullWritable.class);
		job.setOutputKeyClass(Text.class);

		FileInputFormat.addInputPath(job, inPath);
		FileOutputFormat.setOutputPath(job, outPath);

		return job.waitForCompletion(true);
	}

}
package xian.zhang.core;

import java.io.IOException;

import org.apache.hadoop.fs.Path;

public class Main {

	public static void main(String[] args) throws ClassNotFoundException, IOException, InterruptedException {

		if(args.length < 2){
			throw new IllegalArgumentException("要有两个参数,数据输入的路径和输出路径");
		}

		Path inPath1 = new Path(args[0]);
		Path outPath1 = new Path(inPath1.getParent()+"/CombinUser");

		Path inPath2 = outPath1;
		Path outPath2 = new Path(args[1]);

		if(CombinUserInProduct.run(inPath1, outPath1)){
			System.exit(UserCo_occurrenceMatrix.run(inPath2, outPath2)?0:1);
		}
	}

}

代码在github上有

[email protected]:chaoku/ShopxxProductRecommend.git

hadoop实现购物商城推荐系统,布布扣,bubuko.com

时间: 2024-12-19 03:08:59

hadoop实现购物商城推荐系统的相关文章

微信小程序购物商城系统开发系列-目录结构

上一篇我们简单介绍了一下微信小程序的IDE(微信小程序购物商城系统开发系列-工具篇),相信大家都已经蠢蠢欲试建立一个自己的小程序,去完成一个独立的商城网站. 先别着急我们一步步来,先尝试下写一个自己的小demo. 这一篇文章我们主要的是介绍一下小程序的一些目录结构,以及一些语法,为我们后面的微信小程序商城系统做铺垫. 首先我们来了解下小程序的目录结构 Pages 我们新建的一些页面将保存在这个文件夹下面,每一个小程序页面是由同路径下同名的四个不同后缀文件的组成,如:index.js.index.

Python学习day5作业-ATM和购物商城

Python学习day5作业 Python学习day5作业 ATM和购物商城 作业需求 ATM: 指定最大透支额度 可取款 定期还款(每月指定日期还款,如15号) 可存款 定期出账单 支持多用户登陆,用户间转帐 支持多用户 管理员可添加账户.指定用户额度.冻结用户等 购物车: 商品信息- 数量.单价.名称 用户信息- 帐号.密码.余额 用户可充值 购物历史信息 允许用户多次购买,每次可购买多件 余额不足时进行提醒 用户退出时 ,输出当次购物信息 用户下次登陆时可查看购物历史 商品列表分级显示 1

JAVA EE Demo[购物商城 Strust2]

为了搞定作业,我开始了J2EE的Strust2框架实现一个简单的商城Demo 先创建Java Web Service项目.添加JDBC驱动,导入Strust2框架得到这个: 啧啧.既然是购物商城我们继续沿用上篇文章的结构,欢迎页+商城物品列表+购物车+登录 ,则很明显我们需要一个导航栏 创建一个导航栏:head.html 这样我们以后就可以利用JSP标签将这个导航栏嵌入到任何需要的界面了 而导航栏的内容包括欢迎页 商城物品列表 购物车 登录 登出 这些选项 这个时候弄完这个先得到以下: 然后我们

ATM:模拟实现一个ATM + 购物商城程序

额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还款接口 ATM记录操作日志 提供管理接口,包括添加账户.用户额度,冻结账户等... 用户认证用装饰器

模拟实现一个ATM + 购物商城程序

作业需求: 1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息 5.支持多账户登录 6.支持账户间转账 7.记录每月日常消费流水 8.提供还款接口 9.ATM记录操作日志 10.提供管理接口,包括添加账户.用户额度,冻结账户等 11.用户认证用装饰器 ATM交易中心: def make_transaction(arg, tran_type, amoun

python基础作业------模拟实现一个ATM + 购物商城程序

模拟实现一个ATM + 购物商城程序 作业需求: 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还款接口 ATM记录操作日志 提供管理接口,包括添加账户.用户额度,冻结账户等... 用户认证用装饰器 ## ATM信用卡购物模拟程序 ### 作者介绍: * author:高原 ### 功能介绍: 模拟实现一

Python开发程序:ATM+购物商城

一.需求 1.模拟实现一个ATM + 购物商城程序 1).实现功能 1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息 5.支持多账户登录 6.支持账户间转账 7.记录每月日常消费流水 8.提供还款接口 9.ATM记录操作日志 10.提供管理接口,包括添加账户.用户额度,冻结账户等... 11.用户认证用装饰器 二.程序code 程序说明: ## AT

day2编写购物商城(1)

作业:购物商城 商品展示,价格 买,加入购物车 付款,钱不够     具体实现了如下功能: 1.可购买的商品信息显示 2.显示购物车内的商品信息.数量.总金额 3.购物车内的商品数量进行增加.减少和商品的删除 4.用户余额的充值 5.用户购买完成进行结账,将最终余额回写到用户文件中. 一.用户文件说明: kevin 123 50000 sky 123 54000 mobi 123 80000 其中第一列为用户名,第二列为密码,第三列为帐户余额. 二.流程图如下: import sys,os,ge

Day2作业: 购物商城

实现功能: 1用户登陆:用户名或密码错误判断 2商品清单展示 3查看购物车 4商品加入购物车并更新商品清单 5删除购物车中商品并更新商品清单 6查看已购买记录 7购物车商品支付 8支付时余额不足判断 9支付成功删除购物车中对应商品并更新已购买记录 10用户账户余额查看 11充值功能 涉及到4个文件作为库: goods_file   #商品清单1:小米5:1999:92:三星S7:4999:153:华为Mate8:3999:124:魅族pro6:2499:215:苹果6plus:5999:11 g