使用子查询的Hive LATERAL VIEW和WHERE子句

时间:2015-07-22 11:26:55

标签: view hive subquery apache-hive

我正在寻找一种优化查询的方法。

我们有一个名为lea的事件表,其中列app_properties是标记,存储为逗号分隔字符串。

我想选择与选择所需标签的查询结果相匹配的所有事件。

我的第一次尝试:

SELECT uuid, app_properties, tag
FROM events
LATERAL VIEW explode(split(app_properties, '(, |,)')) tag_table AS tag
WHERE tag IN (SELECT source_value FROM mapping WHERE indicator = 'Bandwidth Usage')

但是Hive不允许这样......

FAILED: SemanticException [Error 10249]: Line 4:6 Unsupported SubQuery Expression 'tag': Correlating expression cannot contain unqualified column references.

通过WHERE tag IN取代WHERE tag_table.tag IN而不是运气......

再试一次

FAILED: SemanticException Line 4:6 Invalid table alias tag_table' in definition of SubQuery sq_1 [tag_table.tag IN (SELECT source_value FROM mapping WHERE indicator = 'Bandwidth Usage')] used as sq_1 at Line 4:20

最后......下面的查询给出了期望的结果,但我觉得这不是解决这个用例的最优化方法。是否有人遇到过相同的用例,您需要使用LATERAL VIEW Sub query进行选择?

SELECT to_date(substring(events.time, 0, 10)) as date, t2.code, t2.indicator, count(1) as total
FROM events
LEFT JOIN (
    SELECT distinct t.uuid, im.code, im.indicator
    FROM mapping im
    RIGHT JOIN (
      SELECT tag, uuid
      FROM events
      LATERAL VIEW explode(split(app_properties, '(, |,)')) tag_table AS tag
      ) t
    ON im.source_value = t.tag AND im.indicator = 'Bandwidth Usage'
    WHERE im.source_value IS NOT NULL
) t2 ON (events.uuid = t2.uuid)
WHERE t2.code IS NOT NULL
GROUP BY to_date(substring(events.time, 0, 10)), t2.code, t2.indicator;

1 个答案:

答案 0 :(得分:0)

WHERE子句中的Hive子查询可以与IN,NOT IN,EXIST或NOT一起使用 存在如下。如果在WHERE条件中的列(名称)之前未指定别名(请参阅employee表的以下示例),则Hive将报告错误Correlating表达式不能包含非限定列引用。这是Hive子查询的限制。

来自Apache Hive Essentials。

我猜这个问题也是由子查询引起的。 事件应该有一个别名