2015-02-11 37 views
0

我用Rubular驗證我的正則表達式:蜂房正則表達式SERDE犯規承認我的正則表達式

(\d+)\:+(\d+)+\:+(\d+)+\:+(\d+) 

它完美罰款有沒有下面的字符串

1::594::5::838984679 

但在蜂巢一樣不工作:

create external table ratings8 (userid string, movieid string, rating string, timestamp string) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES ("input.regex" = "(\d+)\:+(\d+)+\:+(\d+)+\:+(\d+)", "output.format.string" = "%1$s %2$s %3$s %4$s") LOCATION '/ratings'; 

有人可以幫我嗎?我究竟做錯了什麼 ?

回答

1

您需要轉義字符串中的反斜槓(\\)。冒號不需要越獄,雖然

(\\d+):+(\\d+)+:+(\\d+)+:+(\\d+) 

它也沒有必要有(\\d+)+,因爲這僅相當於\\d+

+1

不僅沒有必要,它可能會導致災難性的回溯,所以我認爲你的回答應該徹底消除它們。 – nhahtdh 2015-02-12 04:42:39

+0

爲什麼我的正則表達式不工作?我的意思是,它在Rubular中運行良好。 – 2015-02-12 17:32:43

+0

@ShikhaVishwakarma由於這是Hive,因此您的正則表達式的對象實際上是一個Java字符串。 Java字符串將反斜線視爲轉義字符,並且由於您實際上希望這些反斜槓保持原樣並保留爲您的正則表達式的一部分,因此您必須將它們轉義(使用另一個反斜槓)。 – rchang 2015-02-13 02:32:33