从Hive中的拆分数组的末尾开始评估

时间:2015-09-05 16:36:44

标签: hadoop hive

我需要拆分看起来像“B1 / AHU / _1 / RoomTemp”,“B1 / AHU / _1 / 109 / Temp”的标签,所以使用具有可变数量字段的变量。我有兴趣获得最后一个字段,有时候是最后一个字段。我很失望地发现负数索引不计算在右边,允许我像在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 个答案:

答案 0 :(得分:7)

这个问题获得了很多观点(现在已超过一千),所以我认为它需要一个正确的答案。如果我用这个解决了它:

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

在其他建议的答案中没有明确说明 - 我从评论中的建议中得到了这个想法。

此:

  • 反转字符串(所以" abcd / efgh"现在是" hgfe / dcba")
  • 将其拆分为" /"成阵列(所以我们有" hgfe"和" dcba")
  • 提取第一个元素(" hgfe")
  • 然后终于重新逆转(给我们所需的" efgh")

另请注意,可以通过将1替换为0来检索倒数第二个元素,依此类推其他元素。

答案 1 :(得分:3)

有一个很棒的Hive UDF库here。其中一个是LastIndexUDF()。它非常自我解释,它检索数组的最后一个元素。有关在主页上构建和使用jar的说明。希望这会有所帮助。

答案 2 :(得分:3)

这似乎对我有用,它返回SPLIT数组中的最后一个元素

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