簡體   English   中英

我如何在 spark-sql 中使用“not rlike”?

[英]How do I use "not rlike" in spark-sql?

rlike工作正常但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的延續?

在 PySpark 中執行此操作的簡潔方法是:

df.filter(~df.column.rlike(pattern))

沒有什么不是 rlike,但在正則表達式中你有一個叫做負前瞻的東西,這意味着它會給出不匹配的詞。

對於上述查詢,您可以使用如下正則表達式。 可以說,您希望 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 只是匹配您要求匹配的正則表達式。 如果您的正則表達式告訴它不匹配,則適用,如果您的正則表達式用於匹配,則它會執行此操作。

上面的答案建議使用負前瞻。 它可以在某些情況下實現。 然而,正則表達式並不是為了進行有效的否定匹配而設計的。 這些正則表達式容易出錯且難以閱讀。

Spark 從 2.0 版本開始支持“not rlike”。

 # given 'url' is column on a dataframe
 df.filter("""url not rlike "stackoverflow.com"""")

我唯一知道的用法是 sql 字符串表達式(如上所述)。 我在 python api 中找不到“不是”sql dsl 函數。 scala中可能有一個。

我知道你的問題有點老了,但以防萬一:你只是試過 scala 的一元 "?" 操作員?

在 Java 中你會這樣做:

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

在 pyspark 中,我這樣做是:

df = load_your_df()

matching_regex = "yourRegexString"

matching_df = df.filter(df.fieldName.rlike(matching_regex))

non_matching_df = df.subtract(matching_df)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM