Spark 1.4.1
我遇到这样一种情况:按数据框分组,然后对'count'列进行计数和过滤,会引发以下异常
import sqlContext.implicits._
import org.apache.spark.sql._
case class Paf(x:Int)
val myData = Seq(Paf(2), Paf(1), Paf(2))
val df = sc.parallelize(myData, 2).toDF()
然后分组和过滤:
df.groupBy("x").count()
.filter("count >= 2")
.show()
抛出异常:
java.lang.RuntimeException: [1.7] failure: ``('' expected but `>=' found count >= 2
解决方案:
重命名列使问题消失(因为我怀疑与插入的'count'函数'没有冲突)
df.groupBy("x").count()
.withColumnRenamed("count", "n")
.filter("n >= 2")
.show()
那么,这是一种预期的行为,一个bug还是有一个规范的方法来解决?
谢谢,亚历克斯
将字符串传递给filter
函数时,该字符串将被解释为SQL。Count是一个SQL关键字,使用count
作为变量会混淆解析器。这是一个小错误(如果你愿意,你可以提交一个JIRA票据)。
您可以通过使用列表达式而不是字符串来轻松避免这种情况:
df.groupBy("x").count()
.filter($"count" >= 2)
.show()
说实话,我不确定。它看起来像解析器解释那么,这是一个可以预料的行为吗,一个bug
count
不是作为一个列名,而是一个函数,并期望下面的括号。看起来像是一个错误,或者至少是解析器的一个严重限制。
是否有一个规范的方式?
Herman和mattinbits已经提到了一些选项,所以这里有我更多的SQLish方法:
import org.apache.spark.sql.functions.count
df.groupBy("x").agg(count("*").alias("cnt")).where($"cnt" > 2)
我认为一个解决方案是把计数放在反刻度
.filter("`count` >= 2")
http://mail-archives.us.apache.org/mod_mbox/spark-user/201507.mbox/%3C8E43A71610EAA94A9171F8AFCC44E351B48EDF@fmsmsx124.amr.corp.intel.com % 3 e