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查询:根据条件选择一列,另一列值匹配某些特定值,然后将匹配结果创建为新列的主要内容,如果未能解决你的问题,请参考以下文章

sql一列有多值查询,根据多个只查询我想要的数据

Mysql 条件 MAX 或 MIN 依赖于另一列值

mysql如何根据一列值更新另一列的值?

PySpark DataFrame 根据另一列中时间戳值的最小/最大条件更新列值

根据另一列的字段值选择具有相同列值的行

Python散点图设计 - 根据另一列值为x轴选择变量的特定值