我有一个SQL查询,我想把它转换为可以在HiveQL 2.1.1上运行。
SELECT p.id FROM page p, comments c, users u,
WHERE c.commentid= p.id
AND u.id = p.creatorid
AND u.upvotes IN (
SELECT MAX(upvotes)
FROM users u WHERE u.date > p.date
)
AND EXISTS (
SELECT 1 FROM links l WHERE l.relid > p.id
)
这在Hive QL上是行不通的,因为它有一个以上的子查询(不支持)。
EXISTS
或 IN
从SQL到Hive SQL的替换是这样进行的。
WHERE A.aid IN (SELECT bid FROM B...)
可以被替换为:
A LEFT SEMI JOIN B ON aid=bid
但我无法想出一个办法来实现这个功能,并增加了 MAX() 功能。
非常感谢任何帮助。
使用标准的连接语法而不是逗号分隔。
SELECT p.id
FROM page p INNER JOIN
comments c
ON c.commentid= p.id INNER JOIN
users u
ON u.id = p.creatorid INNER JOIN
links l
ON l.relid > p.id
WHERE u.upvotes IN (SELECT MAX(upvotes)
FROM users u
WHERE u.date > p.date
);
我不知道什么是 upvotes
逻辑是应该做的。 该 links
逻辑很容易处理。 Hive可以处理这个问题。
SELECT p.id
FROM page p JOIN
comments c
ON c.commentid = p.id JOIN
users u
ON u.id = p.creatorid CROSS JOIN
(SELECT MAX(l.relid) as max_relid
FROM links l
) l
WHERE l.max_relid > p.id AND
u.upvotes IN (SELECT MAX(upvotes)
FROM users u
WHERE u.date > p.date
);