SQL到HiveQL的转换

问题描述 投票:0回答:1

我有一个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上是行不通的,因为它有一个以上的子查询(不支持)。

EXISTSIN 从SQL到Hive SQL的替换是这样进行的。

WHERE A.aid IN (SELECT bid FROM B...)

可以被替换为:

A LEFT SEMI JOIN B ON aid=bid

但我无法想出一个办法来实现这个功能,并增加了 MAX() 功能。

非常感谢任何帮助。

sql hiveql
1个回答
0
投票

使用标准的连接语法而不是逗号分隔。

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
                   );

0
投票

我不知道什么是 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
                   );
© www.soinside.com 2019 - 2024. All rights reserved.