如何访问数组中的最后一个元素?
Posted
技术标签:
【中文标题】如何访问数组中的最后一个元素?【英文标题】:How to access the last element in an array ? 【发布时间】:2012-12-12 03:55:10 【问题描述】:在我的 hive 表中,session
字段是格式如下的字符串:
ip-sessionID-userID
或 area-sessionID-userID
由“-
”分隔的有 3 或 4 个字段,但 userID 始终是最后一个。
我想选择用户 ID,但如何访问最后一个字段?在python中,有类似的东西:
arr[-1]
但在 hive 中,如何实现这一点?以下 SQL 似乎不正确。
select split(session,"\-")[-1] as user from my_table;
谢谢!
【问题讨论】:
【参考方案1】:reverse(split(reverse(session), '-')[0])
虽然这可能比正则表达式解决方案贵一点;)
【讨论】:
喜欢这个答案。谢谢。【参考方案2】:因为 hive 不支持数组索引的非常量表达式。
还有其他一些方法可以解决您的问题:
使用regexp_extract
,如:
从 my_table 中选择 regexp_extract(session, '(\-[^\-]+)', 1) 作为用户;
使用自定义配置单元功能:示例和文档可以在hive document找到
【讨论】:
如果数组只有一个元素,此正则表达式解决方案不起作用。 试试regexp_extract(session, '([^\-]+)$', 1)
?【参考方案3】:
另一种方法不用reverse
,使用数组size()-1
。这种方法效率更高,因为它不会产生中间反转字符串,它只适用于数组。
select array[size(array)-1] as userID
from
( select split(session,'-') array from your_table ) s;
【讨论】:
【参考方案4】:我认为以下会比@arno_v 的解决方案更快,因为它只反转视图数组元素,而不是整个字符串,并且只反转一次:
reverse(split(session, '-'))[0]
【讨论】:
以上是关于如何访问数组中的最后一个元素?的主要内容,如果未能解决你的问题,请参考以下文章