Hive regexp_extract数据

时间:2015-02-04 14:27:12

标签: regex hive

我试图在hive上使用regexp_extract。

我的数据本质上是不同的,例如:

a2=new something a1=asdasdsad;a2=old something;a3=asadasdsadsa a2=Some place;alksndklsand;a1=asdklsad

现在,我只需要提取a2数据。 半冒号表示a2数据的结尾,但在每种情况下都可能不存在。

我一直在尝试的是结束一个&#39 ;;'到列然后运行regexp_extract来提取" a2 ="之间的数据。和第一个&#34 ;;" (添加&#34 ;;"以使逻辑与所有情况兼容):

regexp_extract(concat(other_data,';'),'(.*)a2=?(.*?);.*',2)

但这根本不起作用。

有人可以建议一个更好的正则表达式吗?

感谢。

3 个答案:

答案 0 :(得分:1)

(?<=a2=)[^;]*(?:;|$)

试试这个。看看演示。

https://www.regex101.com/r/rC2mH4/7

答案 1 :(得分:1)

这个简单的正则表达式将完成这项工作:

.*a2=?(.*?);

这是你的正则表达式,但只有一个捕获组(你不需要捕获它在a2键之前的内容)。

答案 2 :(得分:0)

package main

import (
    "fmt"
    "sort"
)

func main() {
    s := []byte{'1', 'B', 'C', 'a', 'g', 'M', '9'}
    sort.Slice(s, func(i int, j int) bool { return s[i] < s[j] })
    fmt.Println(string(s))
}

我认为RegEx101对您理解逻辑很有帮助。我尝试了上面的表达式,似乎可以提取带有或不带有(?<=a2=)=?([^;\n]*) 的{​​{1}}的内容。