HIVE SubQuery 表达式同时引用 Parent 和 SubQuery 表达式

Posted

技术标签:

【中文标题】HIVE SubQuery 表达式同时引用 Parent 和 SubQuery 表达式【英文标题】:HIVE SubQuery expression refers to both Parent and SubQuery expressions 【发布时间】:2020-04-24 08:26:53 【问题描述】:

所以我有这个 HIVE 查询:

SELECT p.id 
FROM posts p JOIN
comments c ON c.postid = p.id JOIN
users u ON u.id = p.owneruserid JOIN
badges b ON b.userid = u.id CROSS JOIN
postlinks l 
WHERE l.relatedpostid > p.id
AND u.upvotes IN (SELECT MAX(upvotes) AS uv FROM users uu WHERE uu.creationdate > p.creationdate);

它给了我这个错误:

编译语句时出错:FAILED: SemanticException [Error 10249]:第 21:58 行不受支持的子查询表达式“创建日期”: SubQuery 表达式指的是 Parent 和 SubQuery 表达式,并且 不是有效的连接条件。

但我没有看到我的 SubQuery 表达式如何同时引用父查询和 SubQuery?!?

我专门使用user uuuser u 与父查询区分开来,在我的情况下,p.creationdate 必须与父查询相关。

正如post 中所述 HIVE 在子查询方面有一些限制:

    这些子查询仅在表达式的右侧受支持。 IN/NOT IN 子查询只能选择一个列。 EXISTS/NOT EXISTS 必须有一个或多个相关谓词。 仅在子查询的 WHERE 子句中支持对父查询的引用。

但我看不出我是如何打破这些限制的。

我做错了什么?

感谢任何帮助。

编辑:

使用的数据是stackexchange数据的摘录。 所以帖子指的是stackexchange帖子等。

表格:

徽章(id,class,date,name,tagbased,userid)

cmets(id,creationdate,postid,score,text,userdisplayname,userid)

postlinks(id,creationdate,linktypeid,postid,relatedpostid)

帖子(id、acceptedanswerid、answercount、body、closeddate、commentcount、communityowneddate、creationdate、favoritecount、lastactivitydate、lasteditdate、lasteditordisplayname、lasteditoruserid、owner displayname、owneruserid、parentid、posttypeid、score、tags、标题,观看次数)

标签(id、count、excerptpostid、tagname、wikipostid)

用户(id、aboutme、accountid、创建日期、显示名称、downvotes、lastaccessdate、位置、profileimageurl、reputation、upvotes、views、websiteurl)

投票(id,bountyamount,creationdate,postid,userid,votetypeid)

我主要对如何写作感兴趣

SELECT p.id FROM posts p JOIN users u ON u.id = p.owneruserid
WHERE u.upvotes IN 
(SELECT MAX(upvotes) FROM users uu WHERE uu.creationdate > p.creationdate) 

这样它就不会给我这个错误。

【问题讨论】:

我认为这与我的问题无关 【参考方案1】:

如果你想要限制列表,你需要查看documentation。相关限制是:

引用父查询中的列的子查询谓词必须使用等于 (=) 谓词运算符。

子查询中没有相等子句。正如我在原始问题中提到的,您应该提出一个包含示例数据、期望结果以及代码应该做什么的解释的问题。

您查询中的两个麻烦比较都非常不寻常。通常,这种比较将具有相等比较。查询正在执行某事,并且可能有更好的方法来完成您想要的。只是不清楚你想要什么。

【讨论】:

感谢您的回答,我已经更新了一些信息,所以对于以后的访问者来说可能会更清楚一些。 @DigitalJedi 。 . .您有一个问题,当前解决方案表示为查询。你应该问一个关于问题的新问题,而不是关于不工作的查询:你如何做 X?我不明白那段代码在做什么——毫无疑问是有意的,也许有用——但是根据 data 而不是 code 的解释可能会使可以回答这个问题。

以上是关于HIVE SubQuery 表达式同时引用 Parent 和 SubQuery 表达式的主要内容,如果未能解决你的问题,请参考以下文章

HIVE WHERE NOT EXISTS 不比较 NULLS

只允许作为***合取的 SubQuery 表达式

Parquet模式写入分区错误修改

mysql8 公用表表达式CTE的使用

php一个类引用另一个类的方法的写法

如何获取hive建表语句