2015-09-05 37 views
3

我需要拆分一个类似“B1/AHU/_1/RoomTemp”,“B1/AHU/_1/109/Temp”的标签,可变数量的字段。我有兴趣获得最后一个领域,或有时最后一个领域。我很失望地发现负面索引不能从右边算起,并且允许我选择Hive中数组的最后一个元素,就像他们在Python中一样。从Hive中拆分数组的末尾进行评估

select tag,split(tag,'[/]')[ -1] from sensor 

我更感到惊讶时,无论这并不工作:

select tag,split(tag,'[/]')[ size(split(tag,'[\]'))-1 ] from sensor 

这两次给我一个错误沿着这一行:

FAILED: SemanticException 1:27 Non-constant expressions for array indexes not supported. 
Error encountered near token '1' 

所以任何想法?我对Hive很陌生。正则表达式的可能?还是有一些我不知道的语法糖?

回答

3

这个问题是获得了很多的意见(过千了),所以我觉得它需要一个合适的回答。在事件中,我这个解决它:

select tag,reverse(split(reverse(tag),'[/]')[0]) from sensor 

实际上未在其他建议的答案说 - 我从评论建议的想法。

此:

  • 反转串(因此 “ABCD/EFGH” 现在是 “hgfe/DCBA”)
  • 分裂它上 “/” 到一个数组(所以我们有 “hgfe” 和“DCBA”)
  • 提取第一元件(它是“hgfe”)
  • 然后最后再反向(给我们所希望的“EFGH”)

还要注意,第二到最后一个的Elemen t可以通过用1代替0来获取,其他代码可以用t代替。

2

有一个伟大的Hive UDFs库here。其中之一是LastIndexUDF()。它非常自我解释,它检索数组的最后一个元素。有主要页面上构建和使用jar的说明。希望这可以帮助。

+0

很好的建议,但希望更简单一些(一些代码)。 –

+0

如果你不想使用jar,这个问题可能会有所帮助http://stackoverflow.com/questions/13832500/how-to-access-the-last-element-in-an-array – gobrewers14

+0

是的,使用反向(split(reverse()..))arno_v的建议,我发现那里。所以我给你信用。但也许你拥有他一个:)。 –

2

这似乎为我工作,这将返回的最后一个元素从分割阵列

SELECT SPLIT(INPUT__FILE__NAME,'/')[SIZE(SPLIT(INPUT__FILE__NAME,'/')) -1 ] from test_table limit 10; 
+0

我再次使用'reverse(split(reverse())'来获取它,但是您对该建议感到满意:)。 –

+0

:)感谢Mike,'羡慕它 – dedricF

+0

我改变了我使用的答案,因为我发现它更优雅,并且它获得了很多观点。我相信你不会太惊慌。 –