我在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_PP
和M001
。
我尝试使用:
select * where menu[0] = "val1" and menu[1] = "val2"`
也喜欢
menu(0) = "val1" and menu(1) = "val2"
我收到的错误如下:
SemanticException [错误10011]:第3行:0无效的功能&#39;菜单&#39;
如何比较它们?
答案 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"] |
+-------------+--------+-------------------------------------------------------------------------------------------------------+--+