在我的hive表中,session
字段是一个字符串,格式如下:
ip-sessionID-userID
或area-sessionID-userID
有3个或4个字段以“-
”分隔,但userID始终是最后一个。
我想选择userID,但是如何访问最后一个字段?在python中,有类似的东西:
arr[-1]
但在蜂巢中,如何实现这一目标?以下SQL似乎不正确。
select split(session,"\-")[-1] as user from my_table;
谢谢!
答案 0 :(得分:12)
reverse(split(reverse(session), '-')[0])
虽然这可能比正则表达式解决方案贵一点;)
答案 1 :(得分:1)
因为hive中不支持数组索引的非常量表达式。
还有其他一些方法可以解决您的问题:
使用regexp_extract
,例如:
从my_table选择regexp_extract(session,'( - - [^ \ - ] +)',1)用户;
使用自定义配置单元功能:示例和文档可在hive document
答案 2 :(得分:0)
我认为以下内容比@arno_v解决方案要快,因为它只反转视图数组元素,而不是整个字符串,并且只反转一次:
reverse(split(session, '-'))[0]
答案 3 :(得分:0)
另一种不使用reverse
的方法,使用数组size()-1
。此方法效率更高,因为它不产生中间的反向字符串,它仅适用于数组。
select array[size(array)-1] as userID
from
( select split(session,'-') array from your_table ) s;