首页 > 解决方案 > Hive 查询以选择满足多个条件的行

问题描述

我有一个看起来像这样的表(第 1 列是 URL,第 2 列是操作 ID,第 3 列是用户 ID):

1    2    3   
=========== 
d    x    a   
d    q    a 
e    y    a
f    z    a
f    z    b
d    i    b
e    x    b
d    i    c
g    q    c
o    q    c
f    q    c

我正在尝试检查是否有 col1 = 'f' 的行。

如果 col1 = 'f',我需要从 col3 获取用户 ID,然后检查 col3 = userID 的所有行,看看是否有 col2 = 'x' 的行。

如果有任何 userID 具有 col1 = 'f' 的行和 col2 = 'x' 的行,则返回在 col3 中具有 userID 的所有行

我是一个 hive/sql 菜鸟,但这里有一些我认为可以完成我想要做的事情的 python 代码......

df = pd.DataFrame(table)
df2 = df[df['1'].str.contains('f')]
df2['check'] = df2['2'].str.contains('x')
ids = df2[df2['check']]
df = df[df['3'].isin(ids)]

我想要的查询的结果将返回

1    2    3   
=========== 
d    x    a   
d    q    a 
e    y    a
f    z    a
f    z    b
d    i    b
e    x    b

到目前为止,我得到的最接近的是:

SELECT * FROM log AS a
WHERE a.3 in

(
   SELECT DISTINCT 3
   FROM log
   WHERE ((to_date(log_date)) >= (date_sub(current_date, 1)))
   AND 1 = 'f'
)

这让我走到了一半,但它没有在 col2 上过滤并且需要非常长时间才能运行,这可能会导致它在我的环境中失败。

有没有办法只使用 Hive / Spark 来完成这个?我真的不想下载这个文件并在上面运行 python 脚本,因为它有几个 GB,而且我的办公室 wifi 很慢 :(

标签: hivehiveql

解决方案


获取所有用户标识url = 'f'。这会给你(a,b) 使用它来检查用户标识actionid='x'。这会给你(a,b) 最后从上面获取所有具有用户标识的行。

select * from log where userid in
(
    select distinct userid from log 
    where 
            actionid ='x' and 
            userid in (select distinct userid from log where URL='f')
)

推荐阅读