无法从联接中获得我想要的所有数据

时间:2019-01-16 00:34:27

标签: hive hql

我有一个配置单元表,其中包含一些我需要分析的http会话。一栏中的http会话ID在整个会话中都是一致的。

我正在尝试查找属于会话的所有行,其中执行了一组特定操作之一,并且会话以超时结束。

set hive.cli.print.header=true;

SELECT * FROM

(SELECT DISTINCT id, x_date, y
FROM log
WHERE ((to_date(x_date)) >= (date_sub(current_date, 1)))
AND y like '%timeout%') u

JOIN

(SELECT id, x_date, y, z, q, a 
FROM log
WHERE ((to_date(x_date)) >= (date_sub(current_date, 1)))
AND z in ('1', '2', '3', '4')) o

ON u.id = o.id
ORDER BY u.id, o.x_date;

我要查找的是所有行

id = 123 and y like '%timeout%' 
AND (id = 123 and z in('1','2','3','4') 

我现在得到的是类似的东西

if  (id = 123 and y like %timeout%)
select * where (id = 123 and z in ('1','2','3','4'))

期望的输出应该比实际的输出大得多,因为我应该获得许多仅具有ID = 123的行。

问题是我需要同时满足两个条件的所有ID,因此我必须首先真正找到所有ID:)

我希望这是有道理的,我觉得我可能以一种令人困惑的方式措辞了这个问题。

1 个答案:

答案 0 :(得分:0)

尝试一下,它可以在SQL中工作,我对Hive并不精通,但是它应该根据我所读的内容来工作。

SELECT id, x_date, y, z, q, a
FROM log
WHERE z IN ('1','2','3','4','5') 
      AND id IN (
         SELECT id
         FROM log
         WHERE ((to_date(x_date)) >= (date_sub(current_date, 1)))
               AND y like '%timeout%')