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

Posted

技术标签:

【中文标题】如何访问数组中的最后一个元素?【英文标题】:How to access the last element in an array ? 【发布时间】:2012-12-12 03:55:10 【问题描述】:

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

ip-sessionID-userIDarea-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]

【讨论】:

以上是关于如何访问数组中的最后一个元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问json中的数组元素?

shell脚本中的数组常见使用方式

如何在 writeStream 中访问数组类型中的元素?

如何访问 PHP 中的 JSON 元素,如数组对象?

C中的二维数组和指针 - 如何访问元素?

用于访问数组中第一个/最后一个元素的Ruby约定[关闭]