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

时间:2017-02-01 11:34:05

标签: hive hiveql hive-udf

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

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

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

我被困在这里。有人可以建议吗?

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

2 个答案:

答案 0 :(得分:0)

我们可以使用横向视图执行此操作。 让我们在表中分别有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或其他数组函数。

答案 1 :(得分:0)

^^^ error: 'constexpr const value_type Mode<main()::TestEnum, (main::TestEnum)0>::value', declared using local type 'const value_type {aka const main()::TestEnum}', is used but never defined [-fpermissive]

演示

    constexpr operator value_type() const noexcept { return value; }
};

int main()
{
    enum class TestEnum { test1, test2 };
    constexpr Mode<TestEnum, TestEnum::test1> test1 = {};
    constexpr Mode<TestEnum, TestEnum::test2> test2 = {};

    assert(static_cast<TestEnum>(test1) == TestEnum::test1);
}
enum class TestEnum { test1, test2 };
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;