配置单元查询以选择满足多个条件的行

时间:2019-01-25 22:28:59

标签: hive hiveql

我有一个看起来像这样的表(第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的行

我是一个配置单元/ 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速度很慢:(

1 个答案:

答案 0 :(得分:0)

url = 'f'处获取所有用户ID。这将为您提供(a,b) 使用它来检查actionid='x'的用户ID。这将为您提供(a,b) 最后,从上面获取所有具有userid的行。

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')
)