mahout做推荐时uid,pid为string类型
很幸运找到这篇文件,解了燃眉之急。
http://blog.csdn.net/pan12jian/article/details/38703569
mahout做推荐的输入只能是long类型,但在某些网站中,存储的数据不是long类型,是string类型。
现在的手机APP,每个手机都有其device_id,也是string类型。如果能以string类型作为uid,即使用户不注册,不登录。只要采用device_id作为其uid,也可以做精准推荐。
mahout提供了一个接口,能把string转为唯一的long类型数据,然后以map方式存储起来,计算完成后再把long转为string类型。
下面是我的一个小例子
package test;
import org.apache.mahout.cf.taste.impl.model.MemoryIDMigrator;
public class TestMT {
public static void main(String[] args) {
// TODO Auto-generated method stub
String test = "d140615p10693zc";
MemoryIDMigrator thing2long = new MemoryIDMigrator();
Long testLong = thing2long.toLongID(test);
System.out.println(testLong);
thing2long.storeMapping(testLong, test);
String a =thing2long.toStringID(testLong);
System.out.println(a);
}
}
输出
d140615p10693zc
查看mahout源码,其实把string类型变成long采用的是MD5加密方式。源码如下
public abstract class AbstractIDMigrator implements IDMigrator {
private final MessageDigest md5Digest;
protected AbstractIDMigrator() {
try {
md5Digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException nsae) {
// Can't happen
throw new IllegalStateException(nsae);
}
}
/**
* @return most significant 8 bytes of the MD5 hash of the string, as a long
*/
protected final long hash(String value) {
byte[] md5hash;
synchronized (md5Digest) {
md5hash = md5Digest.digest(value.getBytes(Charsets.UTF_8));
md5Digest.reset();
}
long hash = 0L;
for (int i = ; i < ; i++) {
hash = hash << | md5hash[i] & 0x00000000000000FFL;
}
return hash;
}
@Override
public long toLongID(String stringID) {
return hash(stringID);
}
@Override
public void refresh(Collection<Refreshable> alreadyRefreshed) {
}
}
其实根据这个思想,写项目时也可以不调用此接口。在写程序时,可以先用mapreduce对原CSV文件进行处理把所有的数据变为long类型,并记录一个(string key,long value)的文件,然后进行推荐,用结果数据和前mapreduce输出做join即可得出结果。
mahout做推荐时uid,pid为string类型的更多相关文章
- JSP中的“小饼干”Cookie,用来存储数组的方式(下方已String类型的数组为例:)
1.Cookie常用方法中,存储数据的方式: Cookie cookie = new Cookie("key","Value"); response.addCo ...
- 基本数据类型和string类型的转换
基本数据类型转string类型: 方式1:fmt.Sprintf("%参数", 表达式) [个人习惯这个,灵活] 函数的介绍: func Sprintf func Sprintf( ...
- 复习做UWP时涉及到的几种加密签名相关
本人菜鸟一枚,大学里凭兴趣学了一点WP的皮毛,后来又幸运(或者不幸)的进了一家专注于Windows生态的公司做了一段时间的UWP.在博客园写点自己遇到的东西,作为分享,也作为自己的备忘,如果有错误的地 ...
- JVM调优(这里主要是针对优化基于分布式Mahout的推荐引擎)
优化推荐系统的JVM关键参数 -Xmx 设定Java允许使用的最大堆空间.例如-Xmx512m表示堆空间上限为512MB -server 现代JVM有两个重要标志:-client和-server,分别 ...
- Linux C启动时创建pid文件
程序在启动时将pid写入文件,当程序再次启动时会进行检测,避免启动多个实例. util-pidfile.h文件 #ifndef __UTIL_PID_H__ #define __UTIL_PID_H_ ...
- .NET向WebService传值为decimal、double、int、DateTime等非string类型属性时,服务器端接收不到数据的问题
最近在做CRM项目时,使用C#调用SAP PI发布的WebService服务时遇到的问题: 向WebService传值为decimal.double.int.DateTime等非string类型数据时 ...
- 做dg时遇到的log_archive_dest、log_archive_dest_1、db_recovery_file_dest之间互相影响
前提:归档开启.默认不指定归档文件夹. 今晚遇到客户那里设置了闪回区和log_archive_dest.不停库做DG时,无法指定log_archive_dest_n參数,巨坑. .实验了下.结论例如以 ...
- MySQL做练习时总结的一些知识点
MySQL做练习时总结的一些知识点 0:mysql有三种注释方法 上午插入记录的时候一直没有成功,郁闷不知道为什么.因为是很多条记录一起插入,中间一些不用的数据就用"--" ...
- 使用C++做算法时,对内存的管理的办法
使用C++做算法时,对内存的管理的办法 最近老是在想C++的内存控制机制,查了一些资料所以有点想法,自己记录一下免得以后自己忘了. 1. 需求 在做线性代数的算法时,首要的就实现Matrix这个类.由 ...
随机推荐
- DataGridView 在 WinForms中应用不同的单元格式
/// <summary> /// Set the cell background colour to make the ups and downs more visible. /// & ...
- JavaScript:动态代理之远程代理
背景 2008 第一次使用 AJAX 的时候好像使用的是 AJAX.NET,该组件支持为服务器 C# 类型提供 JS 代理,当时不是十分的明白.设计模式中有代理模式,不过真正需要我们手工写代理的次数却 ...
- Spring Boot中使用JavaMailSender发送邮件
相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看看 ...
- Process 'command '/Users/lidaqiang/Library/Android/sdk/build-tools/27.0.3/aapt'' finished with non-zero exit value 1
Process 'command '/Users/lidaqiang/Library/Android/sdk/build-tools/27.0.3/aapt'' finished with non-z ...
- python 直方图hist
import sys sys.path.append('/usr/local/lib/python2.7/site-packages') sys.path.append('/usr/lib/pytho ...
- uvc Android
1) The kernel is V4L2 enabled, e.g.,CONFIG_VIDEO_DEV=yCONFIG_VIDEO_V4L2_COMMON=yCONFIG_VIDEO_MEDIA=y ...
- Caffe的solver参数介绍
版权声明:转载请注明出处,谢谢! https://blog.csdn.net/Quincuntial/article/details/59109447 1. Parameters solver.p ...
- 布拉格捷克理工大学研究团队:Prisma进化版
原文链接 还记得 Prisma 吗?就是能把拍摄的照片转化为各种名画风格的修图软件,神经网络的深度学习后,想要波普还是梵高风的图片都不在话下. 现在,它的进化版本来了.这回是布拉格捷克理工大学的研究 ...
- C/C++ signal 信号处理函数
软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过系统调用kill发送软中断信号. 内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件. 注意,信号只 ...
- ubuntu 安装 android studio
总共分三个步骤: 安装JDK 这里引用下别人的安装过程http://blog.csdn.net/bhq2010/article/details/6839762 注:android studio 版本为 ...