分享

hive 实现逻辑递归查询

chyeers 2018-9-17 09:37:06 发表于 方案探讨 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 8 57580
本帖最后由 chyeers 于 2018-9-17 09:40 编辑

首先举个案例:
一个用户登录访问 aboutyun,他从首页点进第二页,从第二页点进第三页,之后又进入第四页,然后点击回到第二页。用户这样的点击访问操作记录如下访问日志
用户ID
点击访问当前页标ID
点击访问当前页的上一页标识ID
chyeers
A
NULL
chyeers
C
A
chyeers
E
C
chyeers
D
E
chyeers
Q
D
chyeers
E
Q

A是点击的第一页,所以A 的上一页点击是NULL。
能否使用 hive 将该用户的网页访问顺序给取出来?如果能该如何取呢?


已有(9)人评论

跳转到指定楼层
yongjian3311 发表于 2018-9-18 15:48:39
[mw_shl_code=sql,true]DROP TABLE IF EXISTS `user_chase`;
CREATE TABLE `user_chase` (
  `cur_page` varchar(10) DEFAULT NULL,
  `last_page` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user_chase
-- ----------------------------
INSERT INTO `user_chase` VALUES ('A', null);
INSERT INTO `user_chase` VALUES ('C', 'A');
INSERT INTO `user_chase` VALUES ('E', 'C');
INSERT INTO `user_chase` VALUES ('D', 'E');
INSERT INTO `user_chase` VALUES ('Q', 'D');
INSERT INTO `user_chase` VALUES ('E', 'Q');
[/mw_shl_code]

[mw_shl_code=sql,true]SELECT
group_concat(b.last_page SEPARATOR '->')
FROM
nyd_cof.user_chase a
right join nyd_cof.user_chase b
on a.cur_page=b.last_page
where b.last_page is not null [/mw_shl_code]

结果 A->C->E->D->Q->E

貌似跟递归没关系,是典型的关联查询而已
回复

使用道具 举报

sstutu 发表于 2018-9-17 12:31:05
sql难度太大,用udf吧。
回复

使用道具 举报

yongjian3311 发表于 2018-9-18 15:53:13
不过你的表结构应该还是有问题的,如果我有重复访问,这里是识别不出先后顺序的哦
回复

使用道具 举报

chyeers 发表于 2018-9-19 16:44:27
本帖最后由 chyeers 于 2018-9-19 16:47 编辑
yongjian3311 发表于 2018-9-18 15:48
[mw_shl_code=sql,true]DROP TABLE IF EXISTS `user_chase`;
CREATE TABLE `user_chase` (
  `cur_page`  ...
如果我插入表的数据是乱的,不是依次点击插入的,比如
[mw_shl_code=sql,true]INSERT INTO `user_chase` VALUES ('Q','D');
INSERT INTO `user_chase` VALUES ('E', 'Q');
INSERT INTO `user_chase` VALUES ('A', null);
INSERT INTO `user_chase` VALUES ('C', 'A');
INSERT INTO `user_chase` VALUES ('E', 'C');
INSERT INTO `user_chase` VALUES ('D', 'E');[/mw_shl_code]

也就是说,我的log不是按顺序来的,那么join 的结果就是
+------------------------------------------+
| group_concat(b.last_page SEPARATOR '->') |
+------------------------------------------+
| Q->E->A->C->E->D                         |
+------------------------------------------+

现在假设log就是乱的,这样 join 不适应,如何通过递归的查询解决这个问题。


回复

使用道具 举报

chyeers 发表于 2018-9-25 09:46:22
yongjian3311 发表于 2018-9-18 15:53
不过你的表结构应该还是有问题的,如果我有重复访问,这里是识别不出先后顺序的哦

是的,我这个例子是不严谨,主要就是以 递归 的思想来处理类似的问题。
回复

使用道具 举报

JVM 发表于 2019-12-10 15:01:25
hive 如何实现递归? 或者 条件一直循环????
回复

使用道具 举报

阿飞 发表于 2020-1-17 07:32:51
其实是HIV分页,可以参考这个:
Hive实现分页的思路与方法
https://www.aboutyun.com/forum.php?mod=viewthread&tid=9023


回复

使用道具 举报

阿飞 发表于 2020-1-17 07:32:53
其实是HIV分页,可以参考这个:
Hive实现分页的思路与方法
https://www.aboutyun.com/forum.php?mod=viewthread&tid=9023


回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条