如何在hive

时间:2018-01-20 00:34:14

标签: arrays hadoop hive

我在hive中创建了一个包含复杂数据类型array的表。查询是

create table testivr (
     mobNo string,
     callTime string,
     refNo int,
     callCat string,
     menus array <string>,
     endType string,
     duration int,
     transferNode string
     )
row format delimited 
fields terminated by ','
collection items terminated by '|'

加载的记录类似于

  

9220276765 2011-05-01 21:26:45 29 E [&#34; PRE_HOST10_JINGLE_PP-PREF_WELCOME_PP-PREF_PROMO_PP&#34;,&#34; M001:4&#34;,&#34; M477:3&#34 ;,&#34; M005:2&#34;,&#34; M090:5&#34;,&#34; M465:9&#34;] RAT 218 TR716

现在我需要检查数组的前两个字段是否为:

PRE_HOST10_JINGLE_PPPREF_WELCOME_PP-PREF_PROMO_PPM001

我尝试使用:

select * where menu[0] = "val1" and menu[1] = "val2"` 

也喜欢

menu(0) = "val1" and menu(1) = "val2"

我收到的错误如下:

  

SemanticException [错误10011]:第3行:0无效的功能&#39;菜单&#39;

如何比较它们?

1 个答案:

答案 0 :(得分:0)

如果 val1 和 val2 是硬编码值
val1 = "PRE_HOST10_JINGLE_PPPREF_WELCOME_PP-PREF_PROMO_PP"
val2 = 'M001'
您可以尝试将数组转换为字符串并使用 substr 来查找期望值

--sample records
with testivr as (
  select '9220276765' as mobNo
  , '2011-05-01 21:26:45' as callTime
  , 29 as refNo
  , 'E' as callCat
  , array("PRE_HOST10_JINGLE_PP-PREF_WELCOME_PP-PREF_PROMO_PP","M001:4","M477:3","M005:2","M090:5","M465:9") as menus
  , 'RAT' as endType
  , 218 as duration
  , 'TR716' as transferNode
  
  union all 
  
  select '9220276766'
  , '2011-05-02 21:26:45'
  , 30
  , 'E'
  , array("PRE_HOST10_JINGLE_PP-PREF_WELCOME_PP-PREF_PROMO_PP","M001:5","M478:4","M006:3","M091:5","M465:10")
  , 'RAT'
  , 219
  , 'TR717'
  
  union all 
  
  select '9220276767'
  , '2011-05-03 21:26:45'
  , 31
  , 'E'
  , array("PRE_HOST10_JINGLE_PP-PREF_WELCOME_PP-PREF_PROMO_PP","M002:5","M478:4","M006:3","M091:5","M465:10")
  , 'RAT'
  , 220
  , 'TR718'
)

select mobno,refno,menus
from testivr t
where substr(concat_ws(',',menus),1,50) = 'PRE_HOST10_JINGLE_PP-PREF_WELCOME_PP-PREF_PROMO_PP'
  and substr(concat_ws(',',menus),52,4) = 'M001'
;

临时表 testivr:

+-------------+----------------------+----------+------------+-------------------------------------------------------------------------------------------------------+------------+-------------+-----------------+--+
|   t.mobno   |      t.calltime      | t.refno  | t.callcat  |                                                t.menus                                                | t.endtype  | t.duration  | t.transfernode  |
+-------------+----------------------+----------+------------+-------------------------------------------------------------------------------------------------------+------------+-------------+-----------------+--+
| 9220276765  | 2011-05-01 21:26:45  | 29       | E          | ["PRE_HOST10_JINGLE_PP-PREF_WELCOME_PP-PREF_PROMO_PP","M001:4","M477:3","M005:2","M090:5","M465:9"]   | RAT        | 218         | TR716           |
| 9220276766  | 2011-05-02 21:26:45  | 30       | E          | ["PRE_HOST10_JINGLE_PP-PREF_WELCOME_PP-PREF_PROMO_PP","M001:5","M478:4","M006:3","M091:5","M465:10"]  | RAT        | 219         | TR717           |
| 9220276767  | 2011-05-03 21:26:45  | 31       | E          | ["PRE_HOST10_JINGLE_PP-PREF_WELCOME_PP-PREF_PROMO_PP","M002:5","M478:4","M006:3","M091:5","M465:10"]  | RAT        | 220         | TR718           |
+-------------+----------------------+----------+------------+-------------------------------------------------------------------------------------------------------+------------+-------------+-----------------+--+

查询结果:

+-------------+--------+-------------------------------------------------------------------------------------------------------+--+
|    mobno    | refno  |                                                 menus                                                 |
+-------------+--------+-------------------------------------------------------------------------------------------------------+--+
| 9220276765  | 29     | ["PRE_HOST10_JINGLE_PP-PREF_WELCOME_PP-PREF_PROMO_PP","M001:4","M477:3","M005:2","M090:5","M465:9"]   |
| 9220276766  | 30     | ["PRE_HOST10_JINGLE_PP-PREF_WELCOME_PP-PREF_PROMO_PP","M001:5","M478:4","M006:3","M091:5","M465:10"]  |
+-------------+--------+-------------------------------------------------------------------------------------------------------+--+