2017-09-05 82 views
0

我使用Spark2,飛艇和斯卡拉顯示前10個字出現在一個數據集。 我的代碼:我怎麼忽略GROUPBY Scala的第一個元素/火花?

z.show(dfFlat.groupBy("value").count().sort(desc("count")), 10) 

給出: enter image description here 如何忽略「貓」,並通過最後的元素具有「帽子」,即演出2號地塊開始?

我想:

z.show(dfFlat.groupBy("value").count().sort(desc("count")).slice(2,4), 10) 

但是這給:

error: value slice is not a member of org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] 
+0

試圖篩選? – aclokay

+0

你能詳細說一下嗎? – schoon

回答

1

它不是直截了當地丟棄第一行的數據幀(見Drop first row of Spark DataFrame)。

val df = Seq(
    "cat", "cat", "cat", "hat", "hat", "bat" 
).toDF("value") 


val dfGrouped = df 
    .groupBy($"value").count() 
    .sort($"count".desc) 

dfGrouped.show() 

+-----+-----+ 
|value|count| 
+-----+-----+ 
| cat| 3| 
| hat| 2| 
| bat| 1| 
+-----+-----+ 

val dfWithoutFirstRow = dfGrouped 
    .withColumn("rank", dense_rank().over(Window.partitionBy().orderBy($"count".desc))) 
    .where($"rank" =!= 1).drop($"rank") // this filters "cat" 
    .sort($"count".desc) 


dfWithoutFirstRow 
    .show() 

+-----+-----+ 
|value|count| 
+-----+-----+ 
| hat| 2| 
| bat| 1| 
+-----+-----+ 
+0

謝謝,但它給了所有行仍。 – schoon

+0

看到我更新的答案,我想窗口的順序是錯誤 –

+0

謝謝,但還是一樣:( – schoon

0

第一行可以以這種方式被刪除::但是你可以使用窗口功能,做到這一點

val filteredValue = dfGrouped.first.get(0) 
val result = dfGrouped.filter(s"value!='$filteredValue'") 
+0

雖然這個代碼片斷可以解決這個問題,它沒有解釋爲什麼不然怎麼回答了這個問題。請爲你的代碼的解釋,因爲這確實有助於提高您的文章質量。請記住,你所回答的問題在未來的讀者,而那些人可能不知道你的代碼的建議的理由 –