如何访问数组中的最后一个元素?

时间:2012-12-12 03:55:10

标签: arrays hive

在我的hive表中,session字段是一个字符串,格式如下:

ip-sessionID-userIDarea-sessionID-userID

有3个或4个字段以“-”分隔,但userID始终是最后一个。

我想选择userID,但是如何访问最后一个字段?在python中,有类似的东西: arr[-1]

但在蜂巢中,如何实现这一目标?以下SQL似乎不正确。

select split(session,"\-")[-1] as user from my_table;

谢谢!

4 个答案:

答案 0 :(得分:12)

reverse(split(reverse(session), '-')[0])

虽然这可能比正则表达式解决方案贵一点;)

答案 1 :(得分:1)

因为hive中不支持数组索引的非常量表达式。

还有其他一些方法可以解决您的问题:

  1. 使用regexp_extract,例如:

    从my_table选择regexp_extract(session,'( - - [^ \ - ] +)',1)用户;

  2. 使用自定义配置单元功能:示例和文档可在hive document

  3. 中找到

答案 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;