Hive查询:根据条件选择一列,另一列值匹配某些特定值,然后将匹配结果创建为新列
Posted
技术标签:
【中文标题】Hive查询:根据条件选择一列,另一列值匹配某些特定值,然后将匹配结果创建为新列【英文标题】:Hive query: select a column based on the condition another columns values match some specific values, then create the match result as a new column 【发布时间】:2020-05-29 02:37:16 【问题描述】:我必须在 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 不够熟悉。 谁能帮帮我? 提前致谢。
【问题讨论】:
感谢@GMB,作为补充,app_name
栏目中没有重复的情况。
【参考方案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
。您没有指定要如何处理此用例。
在 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, '%')
【讨论】:
你能给我一个turn the list of words to a table
的代码示例吗?我没有找到合适的方法。谢谢。
@BowenPeng:这就是values()
子查询的作用。我还在我的答案中添加了第二个查询,它提供了另一种解决方案。【参考方案2】:
在 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, '%')
此外,对于旧版本的 hive 连接,使用 like
将不起作用,请在 WHERE 中使用带有堆栈和过滤器的交叉连接:
from mytable t
cross join keywords k
where t.col1 like concat('%', k.keyword, '%')
【讨论】:
以上是关于Hive查询:根据条件选择一列,另一列值匹配某些特定值,然后将匹配结果创建为新列的主要内容,如果未能解决你的问题,请参考以下文章