分享

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

本帖最后由 坎蒂丝_Swan 于 2015-1-16 15:46 编辑

问题导读
1.数据补全的具体策略是什么?
2.如何在Oracle下调试SQL?










需求


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



策略


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



实验过程


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

(1)TEST_TOPN:
20140929190035718.png

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

(2)TEST_X_AND_X:
file:///C:/Users/Administrator/Documents/My%20Knowledge/temp/34104002.png 20140929190108218.png

该表中每行代表了针对每一个item的看了又看的item及其访问量。
我们的目的,就是将该表补全,针对每个current_item都要有5个看了又看的item。
比如,针对10001号item,需要从it分类下取得top2填补到该表中来。

Oracle中通过以下SQL成功实现该目的:
  1. select * from
  2. (select row_number() over(partition by current_item_category,current_item_id order by source,view_count desc) no,
  3. current_item_id, current_item_category, andx_item_id, source, view_count  from
  4. (select  current_item_id, current_item_category, andx_item_id, 1 source, view_count
  5. from test_x_and_x
  6. union
  7. select a.current_item_id,a.current_item_category,b.item_id,2,b.view_count
  8. from
  9. (select current_item_id,current_item_category from test_x_and_x
  10.   group by current_item_id,current_item_category) a, test_topn b
  11. where a.current_item_category = b.item_category
  12. )) where no<=5
复制代码


file:///C:/Users/Administrator/Documents/My%20Knowledge/temp/34932586.png

20140929190151406.png

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


2. 将Oracle中的SQL语句移植到HIVE中

成功移植的HIVE SQL:
  1. select * from
  2. (select rank() over(partition by c.current_item_category,c.current_item_id order by c.source,c.view_count desc) no,
  3. c.current_item_id, c.current_item_category, c.andx_item_id, c.source, c.view_count
  4. from
  5. (select current_item_id,current_item_category,andx_item_id,1 source,view_count
  6. from test_x_and_x
  7. union all
  8. 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
  9. from
  10. (select current_item_id,current_item_category from test_x_and_x
  11.   group by current_item_id,current_item_category) a, test_topn b
  12. where a.current_item_category = b.item_category) c
  13. ) d where d.no <= 5;
复制代码


执行结果和Oracle中完全一致:

20140929190229765.png


移植过程中遇到一些坑,特此记录:
  • HIVE只支持union all,不支持union;
  • union all的两张表,不仅要对应字段数据类型相同,字段名(可使用列别名)也必须完全相同;
  • 每一个嵌套子查询的结果集都必须使用表别名!




本文转自http://blog.csdn.net/u010967382/article/details/39674047



本帖被以下淘专辑推荐:

欢迎加入about云群90371779322273151432264021 ,云计算爱好者群,亦可关注about云腾讯认证空间||关注本站微信

已有(3)人评论

跳转到指定楼层
落魂草 发表于 2015-1-16 20:03:39
回复

使用道具 举报

凌飞羽 发表于 2015-1-16 21:01:19
回复

使用道具 举报

wangzhenqiang 发表于 2015-5-26 17:16:35
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条