hive - 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 很慢 :(
解决方案
获取所有用户标识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')
)
推荐阅读
- encoding - 解密http响应
- python - 用 python 请求模仿 curl 命令
- r - Shiny DT:如何手动输入页码?
- xml - 我无法为以下问题创建 XSLT
- flutter - 在 dart/flutter 中覆盖或添加参数到枚举
- reactjs - React Native 警告 - 取消组件WillUnmount 中的所有订阅和异步任务
- maven - 安卓X。无法确定 androidx.multidex:multidex:2.0.0 的工件
- python-3.x - 如何从odoo 11和postgresql中的数据库中获取相关字段值?
- c# - Unity 3d:尝试修改预制克隆的比例时,滑块值发生在第二次运行
- jython - 使用 jython 从文件中删除记录