2015-08-20 58 views
16

火花1.4.1數據幀:如何GROUPBY /計數然後計數過濾Scala中

我遇到的情況下由數據幀分組,然後在「計數」列計數和濾波引起下面

異常
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 

解決方案:

重命名列使問題消失(因爲我懷疑是內插「計數」功能」

df.groupBy("x").count() 
    .withColumnRenamed("count", "n") 
    .filter("n >= 2") 
    .show() 

所以沒有衝突,是一個行爲的期望,一個錯誤還是有一個規範的方式去?

感謝,亞歷克斯

回答

16

當你傳遞一個字符串filter功能,字符串被解釋爲SQL。 Count是一個SQL關鍵字,並使用count作爲變量混淆瞭解析器。這是一個小錯誤(如果你願意,你可以提交JIRA票)。

您可以輕鬆地使用,而不是一個字符串列表達式避免這種情況:

df.groupBy("x").count() 
    .filter($"count" >= 2) 
    .show() 
8

所以,是一個行爲的期望,一個bug

說實話我不。它看起來像解析器將count解釋爲不是列名稱,而是函數,並且期望以下括號。看起來像一個錯誤,或者至少是解析器的嚴重限制。

是否有規範的方式去?

部分選項已被Hermanmattinbits已經述及所以這裏更SQLish辦法從我:

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

df.groupBy("x").agg(count("*").alias("cnt")).where($"cnt" > 2)