gpt4 book ai didi

sql - 将SQL查询转换为Hive查询

转载 作者:行者123 更新时间:2023-12-02 21:40:47 25 4
gpt4 key购买 nike

我在将SQL查询转换为Hive查询时遇到麻烦。

关系模式:

Suppliers(sid, sname, address)
Parts(pid, pname, color)
Catalog(sid, pid, cost)

查询1:查找有某些供应商的零件的名称。
我尝试了查询1的查询转换之一,我认为它是正确的。如果有人可以让我知道它是正确还是不正确,我将不胜感激。根据我寻找的Hive信息,它们对我来说似乎是相同的。

查询1:SQL
SELECT pname
FROM Parts, Catalog
WHERE Parts.pid = Catalog.pid

查询1:转换为Hive
SELECT pname
FROM Parts, Catalog
WHERE Parts.pid = Catalog.pid;

查询2:查找仅供应红色零件的供应商的sid。
对于第二个查询,我遇到了麻烦。主要是我在“不存在”部分和定义我们想要的颜色部分方面遇到麻烦。有人可以帮我解决这个问题吗?我需要将SQL放入Hive查询中。

查询2:SQL
SELECT DISTINCT C.sid
FROM Catalog C
WHERE NOT EXISTS ( SELECT *
FROM Parts P
WHERE P.pid = C.pid AND P.color <> ‘Red’)

如果有人可以帮助我将它们转换为正确的Hive格式,我将不胜感激。

谢谢。

最佳答案

尽管我从未使用过HiveQL查找其某些文档,但它似乎支持用普通sql编写的外部联接。在这种情况下,这应该起作用:(没有匹配项的外部联接)

select distinct c.id
from catalog c
left outer join parts p
on (c.pid = p.pid
and p.color <> 'Red')
where p.pid is null

编辑-放在 ()中的on子句中,通常在任何主要数据库中都不需要,但是似乎在hiveql中是必需的-( https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins)。

关于您的第一个查询,我认为基于这些文档中的示例查询,它不会在 hive 中运行,但是正如另一位评论者所述,最佳做法是通过join子句使用显式联接,而不是where子句中的隐式联接。将where子句视为根据各种条件(联接条件除外)进行过滤的位置,将join子句视为放置所有联接条件的位置。它有助于组织查询的逻辑。此外,您只能暗示内部联接(在where子句中)。每当您要使用外部联接时(例如上面的第二个查询),都需要join子句。

这与您的第一个查询相同,但具有显式联接语法:
select pname
from parts p
join catalog c
on (p.pid = c.pid)

关于sql - 将SQL查询转换为Hive查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28911197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com