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)
小智 6
在 PySpark 中执行此操作的简洁方法是:
df.filter(~df.column.rlike(pattern))
Run Code Online (Sandbox Code Playgroud)
没有什么不一样的,但在正则表达式中,有一种叫做负向前瞻的东西,这意味着它会给出不匹配的单词。
对于上面的查询,您可以使用下面的正则表达式。比方说,您希望 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 只是匹配您要求匹配的正则表达式。如果你的正则表达式告诉它不匹配,它就会应用它,如果你的正则表达式是为了匹配,那么它就会这样做。
| 归档时间: |
|
| 查看次数: |
17812 次 |
| 最近记录: |