2017-09-05 83 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

虽然这个代码片断可以解决这个问题,它没有解释为什么不然怎么回答了这个问题。请为你的代码的解释,因为这确实有助于提高您的文章质量。请记住,你所回答的问题在未来的读者,而那些人可能不知道你的代码的建议的理由 –