首页 > 解决方案 > 无法从联接中获取我想要的所有数据

问题描述

我有一个配置单元表,其中包含一些我需要分析的 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 :)

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

标签: hivehql

解决方案


试试这个,它可以在 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%')

推荐阅读