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/