Hive:如何检查一个数组的值是不是存在于另一个数组中?

Posted

技术标签:

【中文标题】Hive:如何检查一个数组的值是不是存在于另一个数组中?【英文标题】:Hive: How to check if values of one array are present in another?Hive:如何检查一个数组的值是否存在于另一个数组中? 【发布时间】:2017-02-01 11:34:05 【问题描述】:

我有两个这样的数组,它们是从我创建的 UDF 返回的:

数组 A - [P908,S57,A65] 数组 B - [P908,S57]

我需要使用 hive 查询检查数组 A 的元素是否存在于数组 B 中,或者数组 B 的元素是否存在于数组 A 中。

我被困在这里了。有人可以建议一种方法吗?

我还可以从 UDF 返回一些其他数据类型来代替数组以使比较更容易吗?

【问题讨论】:

【参考方案1】:
select      concat(',',concat_ws(',',A),',') regexp 
                concat(',(',concat_ws('|',B),'),')  as are_common_elements
           
from        mytable
;

演示

create table mytable (id int,A array<string>,B array<string>);

insert into table mytable 

                select  1,array('P908','S57','A65'),array('P908','S57')
    union all   select  2,array('P908','S57','A65'),array('P9','S5777')
;      

select * from mytable;

+------------+----------------------+----------------+
| mytable.id |      mytable.a       |   mytable.b    |
+------------+----------------------+----------------+
|          1 | ["P908","S57","A65"] | ["P908","S57"] |
|          2 | ["P908","S57","A65"] | ["P9","S5777"] |
+------------+----------------------+----------------+

select      id
           ,concat(',',concat_ws(',',A),',')    as left_side_of_regexp
           ,concat(',(',concat_ws('|',B),'),')  as right_side_of_regexp
           
           ,concat(',',concat_ws(',',A),',') regexp 
                concat(',(',concat_ws('|',B),'),')  as are_common_elements
           
from        mytable
;

+----+---------------------+----------------------+---------------------+
| id | left_side_of_regexp | right_side_of_regexp | are_common_elements |
+----+---------------------+----------------------+---------------------+
|  1 | ,P908,S57,A65,      | ,(P908|S57),         | true                |
|  2 | ,P908,S57,A65,      | ,(P9|S5777),         | false               |
+----+---------------------+----------------------+---------------------+    
          
          

【讨论】:

【参考方案2】:

我们可以使用横向视图来做到这一点。 让我们有 2 个表 Table1 和 Table2 以及表中的数组字段分别为 col1 和 col2 的列。 使用如下内容:-

select collect_set (array_contains (col1 , r.tab2) ) 
from table1 , 
(select  exp1 as tab2 
 from    (table2 t2 lateral view explode(col2) exploded_table as exp1 ) ) r

您也可以使用array_intersection 或其他数组函数。

【讨论】:

以上是关于Hive:如何检查一个数组的值是不是存在于另一个数组中?的主要内容,如果未能解决你的问题,请参考以下文章

使用 lodash 检查数组是不是存在于另一个数组中

R:基于一个列的值存在于另一列中,生成虚拟变量

检查Table1中的字段组合是不是存在于另一个Table2中(SQL)

如何确定数组中的值是不是存在于 Postgres 表中

检查列 pyspark df 的值是不是存在于其他列 pyspark df

如何检查另一个表中是不是存在主键值?