Hive SQL确定子集

时间:2018-05-18 23:50:13

标签: hadoop hive hiveql

我的公司有一个在Hive SQL中构建一些SQL的软件。 部分是灵活的,可以是任何类型(例如字符串),因为我可以自由存储或转换。 正确部分不灵活,因为它只能在SQL语句中使用('a','b','c')。所以我可以在concat_ws('a','b','c')之类的函数前面添加它,但是我无法删除它周围的括号(..)

我想做两个场景:

  1. ('a','b') ('a','b','c')的子集。所以这将返回TRUE。但是,('a','d') ('a','b','c')的子集将返回FALSE,因为d在右侧不存在。
  2. ('a','b') 至少有一个元素 ('a','b','c')。这会返回TRUE,因为ab位于右侧。但('d','e') ('a','b','c')中至少有一个元素为FALSE
  3. 有没有办法在不编写UDF或添加第三方UDF的情况下执行此操作?

    我正在考虑将它们转换为小写并进行比较,因为'ab''abc'的子串(丑陋的解决方法):

    select instr(concat_ws('|',sort_array(array('B','A','C'))),'A|B')>0;
    

    返回TRUE

    select instr(concat_ws('|',sort_array(array('B','A','C'))),'A|E')>0;
    

    返回FALSE

    但第二种情况更难。我猜是否:

    1. 我可以连接两个字符串
    2. 通过|
    3. 进入阵列
    4. 将唯一值组合到数组
    5. 计算最终数组元素,如果在开头合并少于两个
    6. 奇怪但只是一个想法!

1 个答案:

答案 0 :(得分:0)

您可以查看内置表格生成函数(UDTF)。例如,explode将为数组explode(array ('a', 'b'))的每个元素创建一行。从那以后,你可以使用通常的SQL-fu。

完整示例,实际上适用于两种情况:

 with abc as (
   select explode(array('a', 'b', 'c')) as l
 )
 select
     count(*) = size(array('a', 'b')) as case1
   , count(*) > 0 as case2
 from
   abc 
 where l in
   ('a', 'b') -- true, true
   -- ('a', 'd') -- true, false
   -- ('d', 'e') -- false, false
 ;