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

svmlkihl  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(692)

我必须在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', '', 'don't'] 并选择匹配的关键字result作为新列,命名为 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还不够熟悉。
有人能帮我吗?
提前谢谢。

ryoqjall

ryoqjall1#

您可以将单词列表转换为一个表,并使用模式匹配将其与表联接:

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 如果一个短语上有多个关键字匹配。您没有指定如何处理这个用例。
在hive中,您还可以将其表述为:

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, '%')
vzgqcmou

vzgqcmou2#

在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 将不起作用,请在其中使用交叉连接和堆栈并筛选:

from  mytable t
cross join keywords k
where t.col1 like concat('%', k.keyword, '%')

相关问题