2015-12-30 1885 views
0

rlike工作正常,但not rlike拋出一個錯誤:如何在spark-sql中使用「not rlike」?

scala> sqlContext.sql("select * from T where columnB rlike '^[0-9]*$'").collect() 
res42: Array[org.apache.spark.sql.Row] = Array([412,0], [0,25], [412,25], [0,25]) 

scala> sqlContext.sql("select * from T where columnB not rlike '^[0-9]*$'").collect() 
java.lang.RuntimeException: [1.35] failure: ``in'' expected but `rlike' found 


val df = sc.parallelize(Seq(
    (412, 0), 
    (0, 25), 
    (412, 25), 
    (0, 25) 
)).toDF("columnA", "columnB") 

或者是問題https://issues.apache.org/jira/browse/SPARK-4207的延續?

+1

你可以否定你的正則表達式,只是用'rlike',而不是'不rlike'? – doelleri

+2

@doelleri說,接下來要嘗試的不是(columnB rlike'^ [0-9] * $')'或類似的東西。 (不知道括號是否可選,取決於語言。) – jpmc26

回答

1

沒有什麼不像rlike,但是在正則表達式中你有一些叫做負向lookahead的東西,這意味着它會給出不匹配的詞。

對於上面的查詢,你可以像下面那樣使用正則表達式。可以說,你想ColumnB不應該以數字'0'開始

然後你可以這樣做。

sqlContext.sql("select * from T where columnB rlike '^(?!.*[1-9]).*$'").collect() 
Result: Array[org.apache.spark.sql.Row] = Array([412,0]) 

我的意思了所有的就是,你有正則表達式它自做否定匹配,而不是與RLIKE。 Rlike簡單地匹配你要求匹配的正則表達式。如果你的正則表達式告訴它不匹配,它適用於,如果你的正則表達式匹配,那麼它會這樣做。

謝謝, Regards, Srini。

3

我知道你的問題有點老了,但以防萬一:你是否簡單地嘗試過scala的一元「!」運營商?

在java中,你會去這樣的事情:

DataFrame df = sqlContext.table("T"); 
DataFrame notLikeDf = df.filter(
    df.col("columnB").rlike("^[0-9]*$").unary_$bang() 
);