Hive查询:根据其他列值与某些特定值匹配的条件选择一个列,然后将匹配结果创建为新列

问题描述 投票:2回答:2

我必须在HiveQL中进行一些查询和创建列操作。

例如,

app      col1

app1     anybody love me?
app2     I hate u
app3     this hat is good
app4     I don't like this one
app5     oh my god
app6     damn you.
app7     such nice girl
app8     xxxxx
app9     pretty prefect
app10    don't love me.
app11    xxx anybody?

我想匹配['anybody', 'love', 'you', 'xxx', 'don't']之类的关键字列表,并选择匹配的关键字结果作为新列,命名为keyword,如下所示:

app      keyword

app1     anybody, love
app4     I don't like this one
app6     damn you.
app8     xxx
app10    don't, love
app11    xxx

似乎我必须使用嵌套查询。逻辑有点像选择匹配的结果行​​并设置匹配的结果,这些结果应保存在列表中或类似的新列中。

但是我对HiveQL不够熟悉。有人可以帮我吗?预先感谢。

sql string join hive hiveql
2个回答
1
投票

您可以将单词列表转换为表格,然后使用模式匹配将其与表格连接:

select t.app, k.keyword
from  mytable t
inner join (values ('anybody'), ('you'), ('xxx'), ('don''t')) as k(keyword)
    on t.col1 like conca('%', k.keyword, '%')

[请注意,如果一个词组中有多个关键字匹配,这将复制app。您未指定要如何使用此用例。

在配置单元中,您也可以将其表达为:

select t.app, k.keyword
from  mytable t
inner join table(values 'anybody', 'you', 'xxx', 'don''t') as k(keyword)
    on t.col1 like conca('%', k.keyword, '%')

1
投票

在Hive中,您可以使用stack UDTF

with keywords as (
select stack(4, --the number of tuples
'anybody', 'you', 'xxx', 'don\'t'
) as keyword
)

select t.app, k.keyword
from  mytable t
inner join keywords k
    on t.col1 like concat('%', k.keyword, '%')

也对于使用like的较旧版本的蜂巢联接将不起作用,请在WHERE中将交叉联接与堆栈和过滤器一起使用:

from  mytable t
cross join keywords k
where t.col1 like concat('%', k.keyword, '%')
© www.soinside.com 2019 - 2024. All rights reserved.