dataframe:如何groupBy/count然后过滤Scala中的count

use*_*671 35 scala apache-spark apache-spark-sql

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()
Run Code Online (Sandbox Code Playgroud)

然后分组和过滤:

df.groupBy("x").count()
  .filter("count >= 2")
  .show()
Run Code Online (Sandbox Code Playgroud)

引发异常:

java.lang.RuntimeException: [1.7] failure: ``('' expected but `>=' found count >= 2
Run Code Online (Sandbox Code Playgroud)

解:

重命名列会使问题消失(因为我怀疑与插值'count'函数没有冲突'

df.groupBy("x").count()
  .withColumnRenamed("count", "n")
  .filter("n >= 2")
  .show()
Run Code Online (Sandbox Code Playgroud)

那么,这是一种期望的行为,一个错误还是一种规范的方式?

谢谢,亚历克斯

小智 39

将字符串传递给filter函数时,该字符串将被解释为SQL.Count是一个SQL关键字,count用作变量会混淆解析器.这是一个小错误(如果您愿意,可以提交JIRA票证).

您可以通过使用列表达式而不是String来轻松避免这种情况:

df.groupBy("x").count()
  .filter($"count" >= 2)
  .show()
Run Code Online (Sandbox Code Playgroud)


zer*_*323 21

那么,这是一种期望的行为,一个错误

说实话,我不确定.看起来解析器不是解释count为列名而是解释函数,并且需要使用括号.看起来像一个错误或至少是解析器的严重限制.

有一种规范的方式可以绕过吗?

Hermanmattinbits已经提到了一些选项,所以这里有更多的SQLish方法:

import org.apache.spark.sql.functions.count

df.groupBy("x").agg(count("*").alias("cnt")).where($"cnt"  > 2)
Run Code Online (Sandbox Code Playgroud)