【问题标题】:Hive Query to select lines that meet multiple criteriaHive 查询以选择满足多个条件的行
【发布时间】:2019-01-25 22:28:58
【问题描述】:

我有一个看起来像这样的表(第 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 获取 userID,然后检查 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 很慢 :(

【问题讨论】:

    标签: hive hiveql


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-24
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 2011-07-20
      相关资源
      最近更新 更多