需求
在推荐系统场景中,假设基础行为数据太少,或者过于稀疏,通过推荐算法计算得出的推荐结果非常可能达不到要求的数量。
比方,希望针对每一个item或user推荐20个item,可是通过计算仅仅得到8个。剩下的12个就须要补全。

欢迎转载,请注明出处:
http://blog.csdn.net/u010967382/article/details/39674047

策略
数据补全的详细策略是:
  • 补全时机:在挖掘计算结束后,挖掘结果导入HBase(终于web系统从HBase取数据)前。进行数据补全,补全后的数据再导入HBase。(还有另外一个可选时机,在接到请求后再在程序中实现补全,但这种效率肯定没有直接从HBase中读数的高,所以空间换时间是更为合理的策略);
  • 实现技术:补全过程基于HIVE实现;
  • 补全数据:測试过程使用当前浏览item同分类下近一段时间的浏览量TopN;
  • 測试场景:本文仅针对“看了又看”进行数据补全实验。其他推荐需求类似。


实验过程

1.首先在Oracle下调试SQL
调试过程涉及两张表:
(1)TEST_TOPN:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDk2NzM4Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

该表中每行代表了一个item在某一天的訪问量。 

(2)TEST_X_AND_X:
 
该表中每行代表了针对每个item的看了又看的item及其訪问量。
我们的目的。就是将该表补全,针对每一个current_item都要有5个看了又看的item。

比方,针对10001号item,须要从it分类下取得top2填补到该表中来。


Oracle中通过下面SQL成功实现该目的:
select * from 
(select row_number() over(partition by current_item_category,current_item_id order by source,view_count desc) no,
current_item_id, current_item_category, andx_item_id, source, view_count  from
( source, view_count 
 from test_x_and_x
union 
select,b.view_count
 from 
 (select current_item_id,current_item_category from test_x_and_x
  group by current_item_id,current_item_category) a, test_topn b
 where a.current_item_category = b.item_category

))


注意:当中的source列用于标识数据来自原始表还是TOPN,全部TOPN的表数据都排在原始表数据之后。


2. 将Oracle中的SQL语句移植到HIVE中
成功移植的HIVE SQL:
select * from
(select rank() over(partition by c.current_item_category,c.current_item_id order by c.source,c.view_count desc) no,
c.current_item_id, c.current_item_category, c.andx_item_id, c.source, c.view_count
from
(select current_item_id,current_item_category,andx_item_id,1 source,view_count
 from test_x_and_x
union all
select a.current_item_id current_item_id,a.current_item_category current_item_category,b.item_id andx_item_id,2 source,b.view_count view_count
 from
 (select current_item_id,current_item_category from test_x_and_x
  group by current_item_id,current_item_category) a, test_topn b
 where a.current_item_category = b.item_category) c
) d where d.no <= 5;

运行结果和Oracle中全然一致:


移植过程中遇到一些坑。特此记录:
  1. HIVE仅仅支持union all,不支持union。

  2. union all的两张表。不仅要相应字段数据类型同样,字段名(可使用列别名)也必须全然同样;

  3. 每个嵌套子查询的结果集都必须使用表别名!

【甘道夫】使用HIVE SQL实现推荐系统数据补全的更多相关文章

  1. 【甘道夫】Hive 0.13.1 on Hadoop2.2.0 + Oracle10g部署详细解释

    环境: hadoop2.2.0 hive0.13.1 Ubuntu 14.04 LTS java version "1.7.0_60" Oracle10g ***欢迎转载.请注明来 ...

  2. 【甘道夫】通过Mahout构建推荐系统--通过IDRescorer扩展评分规则

    通过Mahout构建推荐系统时,假设我们须要添�某些过滤规则(比方:item的创建时间在一年以内),则须要用到IDRescorer接口,该接口源代码例如以下: package org.apache.m ...

  3. 【甘道夫】Win7x64环境下编译Apache Hadoop2.2.0的Eclipse小工具

    目标: 编译Apache Hadoop2.2.0在win7x64环境下的Eclipse插件 环境: win7x64家庭普通版 eclipse-jee-kepler-SR1-win32-x86_64.z ...

  4. 【甘道夫】MapReduce实现矩阵乘法--实现代码

    之前写了一篇分析MapReduce实现矩阵乘法算法的文章: [甘道夫]Mapreduce实现矩阵乘法的算法思路 为了让大家更直观的了解程序运行,今天编写了实现代码供大家參考. 编程环境: java v ...

  5. 【甘道夫】Sqoop1.99.3基础操作--导入Oracle的数据到HDFS

    第一步:进入clientShell fulong@FBI008:~$ sqoop.sh client Sqoop home directory: /home/fulong/Sqoop/sqoop-1. ...

  6. 【甘道夫】HBase(0.96以上版本号)过滤器Filter具体解释及实例代码

    说明: 本文參考官方Ref Guide,Developer API和众多博客.并结合实測代码编写.具体总结HBase的Filter功能,并附上每类Filter的对应代码实现. 本文尽量遵从Ref Gu ...

  7. 【甘道夫】HBase基本数据操作的详细说明【完整版,精绝】

    介绍 之前具体写了一篇HBase过滤器的文章.今天把基础的表和数据相关操作补上. 本文档參考最新(截止2014年7月16日)的官方Ref Guide.Developer API编写. 全部代码均基于& ...

  8. 【甘道夫】怎样在cdh5.2上执行mahout的itemcf on hadoop

    环境: hadoop-2.5.0-cdh5.2.0 mahout-0.9-cdh5.2.0 步骤: 基本思路是,将mahout下的全部jar包都引入hadoop的classpath就可以,所以改动了$ ...

  9. 【甘道夫】Apache Hadoop 2.5.0-cdh5.2.0 HDFS Quotas 配额控制

    前言 HDFS为管理员提供了针对文件夹的配额控制特性,能够控制名称配额(指定文件夹下的文件&文件夹总数),或者空间配额(占用磁盘空间的上限). 本文探究了HDFS的配额控制特性,记录了各类配额 ...

随机推荐

  1. 简单的web三层架构系统【第二版】

    昨天写了 web三层架构的第一版,准确的说是三层架构的前期,顶多算是个二层架构,要慢慢完善. 第一版里,程序虽说能运行起来,但是有一个缺陷,就是里面的SQL语句,是使用的拼接字符进行执行.这样安全系数 ...

  2. sql Servers数据库基础

    1. 数据库约束包含:     ·非空约束     ·主键约束(PK) primary key constraint 唯一且不为空     ·唯一约束(UQ) unique constraint 唯一 ...

  3. 发生了Post错误:错误代码40005,微信返回错误信息:invalid file type

    给客户部署 PxxCms, 使用群发功能发送图文的的时候提示: 发生了Post错误:错误代码40005,微信返回错误信息:invalid file type, 没学过php伤不起 ... Google ...

  4. (Problem 41)Pandigital prime

    We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly o ...

  5. WORD 无格式粘贴 2003 2007 MacOS2011

    2003 打开Word窗口,依次点击“工具----宏----Visual Basic编辑器”,打开“Microsoft visual Basic”窗口,在左侧“工程”栏选中“Normal”工程,点击“ ...

  6. 利用反馈字段给帝国cms添加留言板功能(图文教程)

    帝国cms的插件中提供信息反馈字段,很多人却不会用.这里谢寒教大家如何来给自己的帝国cms网站添加留言板功能 1.找到添加地址 2.添加字段 3.你可以在字段中添加多种字段类型(有文本域,单行文本框, ...

  7. delphi 文件夹权限设置(执行一个小脚本的笨办法)

    如题,研究了一天,也没再网上找到比较好的方式,自己做了一个.方法如下: 1.创建一个 cmd 命令文件.2.调用该命令. 代码如下:   S:='echo y|cacls h: /t /c /g ev ...

  8. openstack之Nova

    一.Nova简介及其核心组件: Nove在openstack中提供计算服务: Nova核心模块: Controller Nova-api:提供API,包括命令行API; Nova-schedule: ...

  9. 3.5 用NPOI操作EXCEL--巧妙使用Excel Chart

    在NPOI中,本身并不支持Chart等高级对象的创建,但通过l模板的方式可以巧妙地利用Excel强大的透视和图表功能,请看以下例子. 首先建立模板文件,定义两列以及指向此区域的名称“sales”: 创 ...

  10. js正则表达式验证字符长度

    原理,就是把一个汉字替换为两个字母,来实现长度验证. //js正则验证字符长度 第一种:直接输出长度 alert('1sS#符'.replace(/[^\x00-\xff]/g, 'AA').leng ...