我需要拆分看起来像“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的新手。也许是正则表达式?或者是否有一些我不知道的语法糖?
答案 0 :(得分:7)
这个问题获得了很多观点(现在已超过一千),所以我认为它需要一个正确的答案。如果我用这个解决了它:
select tag,reverse(split(reverse(tag),'[/]')[0]) from sensor
在其他建议的答案中没有明确说明 - 我从评论中的建议中得到了这个想法。
此:
另请注意,可以通过将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;