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

Woo*_*per 5 scala apache-spark apache-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")
Run Code Online (Sandbox Code Playgroud)

或者它是问题https://issues.apache.org/jira/browse/SPARK-4207 的延续?

小智 6

在 PySpark 中执行此操作的简洁方法是:

df.filter(~df.column.rlike(pattern))
Run Code Online (Sandbox Code Playgroud)

  • 我们的无名英雄!这应该是公认的答案,但很久以前就被问过:) (3认同)

Sri*_*ini 5

没有什么不一样的,但在正则表达式中,有一种叫做负向前瞻的东西,这意味着它会给出不匹配的单词。

对于上面的查询,您可以使用下面的正则表达式。比方说,您希望 ColumnB 不应以数字“0”开头

然后你可以这样做。

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

我的意思是,你必须使用正则表达式本身来否定匹配,而不是使用 rlike。Rlike 只是匹配您要求匹配的正则表达式。如果你的正则表达式告诉它不匹配,它就会应用它,如果你的正则表达式是为了匹配,那么它就会这样做。