dataframe:如何在Scala中对分组/计数进行过滤



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

相关内容

  • 没有找到相关文章

最新更新