使用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. 每一个嵌套子查询的结果集都必须使用表别名!

目录
相关文章
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
简介:本文整理自阿里云高级技术专家李麟在Flink Forward Asia 2025新加坡站的分享,介绍了Flink 2.1 SQL在实时数据处理与AI融合方面的关键进展,包括AI函数集成、Join优化及未来发展方向,助力构建高效实时AI管道。
1433 43
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
本文整理自阿里云的高级技术专家、Apache Flink PMC 成员李麟老师在 Flink Forward Asia 2025 新加坡[1]站 —— 实时 AI 专场中的分享。将带来关于 Flink 2.1 版本中 SQL 在实时数据处理和 AI 方面进展的话题。
732 0
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
451 5
|
12月前
|
机器学习/深度学习 数据采集 人工智能
别怪推荐系统不懂你,可能是你的数据“太模糊”了
别怪推荐系统不懂你,可能是你的数据“太模糊”了
573 9
|
存储 消息中间件 搜索推荐
京东零售基于Flink的推荐系统智能数据体系
摘要:本文整理自京东零售技术专家张颖老师,在 Flink Forward Asia 2024 生产实践(二)专场中的分享,介绍了基于Flink构建的推荐系统数据,以及Flink智能体系带来的智能服务功能。内容分为以下六个部分: 推荐系统架构 索引 样本 特征 可解释 指标 Tips:关注「公众号」回复 FFA 2024 查看会后资料~
859 1
京东零售基于Flink的推荐系统智能数据体系
|
SQL 数据挖掘 关系型数据库
【SQL 周周练】一千条数据需要做一天,怎么用 SQL 处理电表数据(如何动态构造自然月)
题目来自于某位发帖人在某 Excel 论坛的求助,他需要将电表缴费数据按照缴费区间拆开后再按月份汇总。当时用手工处理数据,自称一千条数据就需要处理一天。我将这个问题转化为 SQL 题目。
614 12
|
SQL 数据采集 资源调度
【SQL 周周练】爬取短视频发现数据缺失,如何用 SQL 填充
爬虫爬取抖音和快手的短视频数据时,如果遇到数据缺失的情况,如何使用 SQL 语句完成数据的补全。
685 5
|
SQL 关系型数据库 MySQL
SQL如何对不同表的数据进行更新
本文介绍了如何将表A的Col1数据更新到表B的Col1中,分别提供了Microsoft SQL和MySQL的实现方法,并探讨了多表合并后更新的优化方式,如使用MERGE语句提升效率。适用于数据库数据同步与批量更新场景。