使用HIVE SQL实现推荐系统数据补全

需求

在推荐系统场景中,如果基础行为数据太少,或者过于稀疏,通过推荐算法计算得出的推荐结果很可能达不到要求的数量。

比如,希望针对每个item或user推荐20个item,但是通过计算只得到8个,剩下的12个就需要补全。

策略

数据补全的具体策略是:

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

实验过程

1. 首先在Oracle下调试SQL

调试过程涉及两张表:

(1)TEST_TOPN:

该表中每行代表了一个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

(select current_item_id, current_item_category, andx_item_id, 1 source, view_count

from test_x_and_x

union

select a.current_item_id,a.current_item_category,b.item_id,2,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

)) where no<=5

注意:其中的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. 每一个嵌套子查询的结果集都必须使用表别名!
时间: 2024-06-13 18:02:05

使用HIVE SQL实现推荐系统数据补全的相关文章

《移动数据挖掘》—— 2.2 缺失数据补全

2.2 缺失数据补全 前面提到过移动数据有多种类型,可能是人们携带智能设备收集的GPS轨迹数据,也可能是利用公交卡乘坐的公交车或地铁的信息,还可能是人们在移动社交网络中分享的地点访问信息,甚至是收集基站通信时留下的日志信息解析出的位置数据.在这些移动数据中,数据缺失是一种常见的现象.比如,当人们进入高楼大厦时,智能设备无法很好地与卫星定位系统进行通信,使得GPS可能很难对人们进行精确的定位.尽管结合基站定位或Wi-Fi定位,定位的方法得到了很大的改进,但是问题并没有得到彻底的解决.因而,人们通过

c++-C++ 6.0周期数据拟合补全

问题描述 C++ 6.0周期数据拟合补全 从文件读入浮点数到C++ 6.0语言中,求出方差,并且根据方差补全缺失的数据,具体怎么做呢? 解决方案 http://emuch.net/html/201205/8173323.html

access-在c#中补全表中缺失的数据

问题描述 在c#中补全表中缺失的数据 在c#中,编写语句与ACCESS数据库连接,因为表中的数据不完整,怎么在现有的行中插入缺省的数据,用什么,insert不行,alter不行,update可以吗? 解决方案 什么叫现有的行插入?数据库中行才叫插入,列插入的话,就是修改表结构了,那用alter table. 解决方案二: 已经有记录,再搞缺省值,就只能用update了,不过在update之后,为了新的记录有缺省值,需要alter table给出缺省值

自动补全(bootstrap-typeahead)利用ajax获取数据,求教

问题描述 自动补全(bootstrap-typeahead)利用ajax获取数据,求教 自动补全(bootstrap-typeahead)利用ajax获取数据,求教 解决方案 参考下帅帅的冠军叔叔的bloghttp://www.cnblogs.com/haogj/p/3376874.html 解决方案二: bootstrap的官方例程中是有的-

PHP+jQuery实现自动补全功能源码_php技巧

前面手工写了一个下拉自动补全功能,写的简单,只实现了鼠标选择的功能,不支持键盘选择.由于项目很多地方要用到这个功能,所以需要用心做一下.发现select2这个插件的功能可以满足当前需求. 在使用jquery插件select2的过程中遇到了一些疑惑,无论是穿json数据还是通过jsonp方式取数据,都能够正确返回.可是下拉列表中的条目却不能被选中,对鼠标和键盘选择都无效. 后来发现,select2插件在实现选中时是以数据中的id字段为准的.所以不管是json还是jsonp,ajax返回的数据都必须

mycli —— MySQL 自动补全和语法高亮

mycli 是一个 MySQL 的命令行客户端,可以实现自动补全(auto-completion)和语法高亮. 特性: mycli 使用 prompt_toolkit 编写 当你输入 SQL 关键字,数据库的表格和列时,自动补全. 语法高亮使用 Pygments. 智能补全(默认启用),会提示文本感应的(context-sensitive)补全. SELECT * FROM 只显示表格名称 SELECT * FROM users WHERE 只显示列名称. 配置文件在第一次启动时,自动创建在 ~

ORACLE 常用的SQL语法和数据对象

oracle|sql语法|对象|数据 一.数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, --) VALUES ( 值1, 值2, --); INSERT INTO 表名(字段名1, 字段名2, --)  SELECT (字段名1, 字段名2, --) FROM 另外的表名; 字符串类型的字段值必须用单引号括起来, 例如: 'GOOD DAY'如果字段值里包含单引号' 需要进行字符串转换, 我们把它替换成两个

asp.net+ajax+sqlserver自动补全功能实现解析

 这篇文章主要介绍了asp.net + ajax + sqlserver 自动补全功能,需要的朋友可以参考下 代码下载    说明:数据库连接字符串在web.config文件中,为方便运行使用的是官方的Northwind数据库.    参考(向其作者致敬):    ² http://www.loveweb8.com/plus/demo.php?aid=57这个例子是html源码.利用jquery.autocomplete插件利用js实现了自动补全功能.由于我的需要是结合sqlserver数据库表

SQL Server 2005和SQL Server 2000数据的相互导入

  1) SQL Server 2000数据导入SQL Server 2005 在SQL Server 2000中,把其数据进行备份,在数据库中点击右键,选择"所有任务"下的"备份数据库",弹出一个对话框,然后点击"添加"按钮,输入对应的数据库备份名称,就可以备份数据了.然后在SQL Server 2005中,在数据库中点击右键,点击"还原数据库",在弹出的对话框中,"常规"的选项卡中,"目标数据