将SQL查询转换为Hive查询

时间:2015-03-07 03:56:14

标签: sql database hadoop hive

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

关系架构:

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

查询1:找到有供应商的零件的pnames。 我尝试过查询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:查找仅提供红色部件的供应商的sids。 对于第二个查询,我遇到了麻烦。主要是我遇到“不存在”部分和定义我们想要的颜色的问题。有人可以帮我解决这个问题吗?我需要将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格式,我会非常感激。

谢谢。

1 个答案:

答案 0 :(得分:0)

虽然我从来没有使用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

编辑 - 包含在()中的子句,这通常不是任何主要数据库所必需的,但似乎在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)