我有一个看起来像这样的表(第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速度很慢:(
答案 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')
)