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的延续?

最佳答案

没有什么不像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只是匹配您要求匹配的正则表达式。如果您的正则表达式告诉它不匹配,那么它将应用该规则,如果您的正则表达式用于匹配,那么它将这样做。

关于scala - 如何在spark-sql中使用“not rlike”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34534088/

10-12 22:56