9

在我的配置单元表中,该session字段是格式如下的字符串:

ip-sessionID-userID或者area-sessionID-userID

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

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

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

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

谢谢!

4

4 回答 4

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

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

于 2013-11-15T13:01:43.287 回答
1

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

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

  1. 使用regexp_extract,如:

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

  2. 使用自定义配置单元功能:示例和文档可以在配置单元文档中找到

于 2012-12-12T16:00:04.817 回答
1

reverse使用数组的另一种方法size()-1。这种方法更有效,因为它不会产生中间反转字符串,它只适用于数组。

select array[size(array)-1] as userID
from
( select split(session,'-') array from your_table ) s;
于 2019-05-08T06:58:56.370 回答
0

我认为以下会比@arno_v 的解决方案更快,因为它只反转视图数组元素,而不是整个字符串,并且只反转一次:

reverse(split(session, '-'))[0]
于 2018-10-23T07:31:48.973 回答