Hive 配置单元:如何检查一个数组的值是否存在于另一个数组中?

Hive 配置单元:如何检查一个数组的值是否存在于另一个数组中?,hive,hiveql,hive-udf,Hive,Hiveql,Hive Udf,我有两个这样的数组,它们是从我创建的UDF返回的: 阵列A-[P908,S57,A65] 阵列B-[P908,S57] 我需要使用配置单元查询检查数组A的元素是否存在于数组B中,或者数组B的元素是否存在于数组A中 我被困在这里了。有人能建议一条路吗 我还可以从UDF中返回一些其他数据类型来代替数组,以便更轻松地进行比较吗?我们可以使用横向视图进行此操作。 让我们有两个表,表1和表2以及表中数组字段分别为col1和col2的列。 使用类似以下内容:- select collect_set (arr

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

阵列A-[P908,S57,A65] 阵列B-[P908,S57]

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

我被困在这里了。有人能建议一条路吗


我还可以从UDF中返回一些其他数据类型来代替数组,以便更轻松地进行比较吗?

我们可以使用横向视图进行此操作。 让我们有两个表,表1和表2以及表中数组字段分别为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
您也可以使用数组交叉或其他数组函数

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               |
+----+---------------------+----------------------+---------------------+