Hive:如何检查一个数组的值是否存在于另一个数组中?
Hive: How to check if values of one array are present in another?
我有两个这样的数组,它们是从我创建的 UDF return编辑的:
数组 A - [P908,S57,A65]
数组 B - [P908,S57]
我需要使用配置单元查询检查数组 A 的元素是否存在于数组 B 中,或者数组 B 的元素是否存在于数组 A 中。
我被困在这里了。谁能推荐一个方法?
我还可以 return UDF 中的一些其他数据类型来代替数组以使比较更容易吗?
我们可以使用横向视图来做到这一点。
让我们有 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或其他数组函数。
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 |
+----+---------------------+----------------------+---------------------+
我有两个这样的数组,它们是从我创建的 UDF return编辑的:
数组 A - [P908,S57,A65] 数组 B - [P908,S57]
我需要使用配置单元查询检查数组 A 的元素是否存在于数组 B 中,或者数组 B 的元素是否存在于数组 A 中。
我被困在这里了。谁能推荐一个方法?
我还可以 return UDF 中的一些其他数据类型来代替数组以使比较更容易吗?
我们可以使用横向视图来做到这一点。 让我们有 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或其他数组函数。
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 |
+----+---------------------+----------------------+---------------------+