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这个类.由 ...
随机推荐
- CCConfiguration::sharedConfiguration()->loadConfigFile cocos2d-x 中文乱码问题及国际化解决方案
from:://http://www.cnblogs.com/sunguangran/archive/2013/07/29/3222660.html 将显示文本单独保存为文本文件 在cocos2d-x ...
- DataGridView 在 WinForms中应用不同的单元格式
/// <summary> /// Set the cell background colour to make the ups and downs more visible. /// & ...
- DotNetty的通道处理细节
第一,客户端如何向服务器主动发送消息: 第二,服务器如何向指定客户端发送消息: 第三,在哪里做报文的拆包和组包. public partial class FrmMain : Form { publi ...
- WordPress主题开发实例:get_term_by()获取指定分类链接
根据名称获取链接 <?php //根据名称获取对应的id $term=get_term_by('name','新闻动态','category'); $term_id=$term->term ...
- 为什么不能用memcached存储Session
Memcached创建者Dormando很早就写过两篇文章[1][2], 告诫开发人员不要用memcached存储Session.他在第一篇文章中给出的理由大致是说,如果用memcached存储Ses ...
- android应用推荐
脱单宝典: http://file.bmob.cn/M00/D5/1E/oYYBAFR27BOAPu1JACq_bnF_6-E971.apk
- 《“胡”说IC——菜鸟工程师完美进阶》
<“胡”说IC——菜鸟工程师完美进阶> 基本信息 作者: 胡运旺 出版社:电子工业出版社 ISBN:9787121229107 上架时间:2014-5-15 出版日期:2014 年5月 开 ...
- Error: Program type already present: android.arch.lifecycle.LifecycleRegistry$1
com.firebaseui:firebase-ui-firestore:3.1.0 depends on android.arch.lifecycle:extensions:1.0.0-beta1. ...
- JavaScript:Functions
ylbtech-JavaScript:Functions 1.返回顶部 JavaScript 全局对象 全局属性和函数可用于所有内建的 JavaScript 对象. 顶层函数(全局函数) 函数 描述 ...
- 日志收集以及分析:Splunk
转自:http://blog.163.com/guaiguai_family/blog/static/20078414520132181010189/ 写代码的人都知道日志很重要,机器不多的时候,查看 ...