首页 > 解决方案 > 如何获取每个 user_id(列名)只有 10 行的新数据框?

问题描述

我有一个看起来像这样的数据框:

 scala> df.show()
 +-------+-------+                                                               
 |user_id|book_id|
 +-------+-------+
 | 235610|2757548|
 | 235610|2352922|
 | 235610| 620968|
 | 235610|1037143|
 | 235610|2319578|
 |   ... | ....  |
 | 235610|1037143|
 | 235610|2319578|

它在“user_id”列中有三个不同的用户,如下所示:

scala> val df1 = df.select("user_id").distinct()
scala> df1.show()
+-------+                                                                       
|user_id|
+-------+
| 235610|
| 211065|
| 211050|
+-------+

每行数user("235610","211065","21050")如下:

scala> df.filter($"user_id"==="235610").count()
res28: Long = 140  

scala> df.filter($"user_id"==="211065").count()
res29: Long = 51

scala> df.filter($"user_id"==="211050").count()
res30: Long = 64

现在我的问题是如何获得每个 user_id 只有 10 行的新数据框?因为每个user_id("235610","211065","21050")用户都有超过 10 条记录。

Spark 版本 2.3.0。任何帮助将不胜感激。

标签: scalaapache-spark

解决方案


您的 spark 版本是 1.4,等级适用于 hive 上下文。

所以在 hiveContext 上注册你的 df:

 df.registerTempTable("tempDF")

 val dfRanked = hiveContext.sql("select dataWithRank.*,  
        dense_rank() OVER 
              ( PARTITION BY dataWithRank.book_id ORDER BY dataWithRank.book_id DESC) AS Rank 
   from tempDF as dataWithRank)
dfRanked.filter("Rank>10")

这里有关蜂巢等级的文档: http ://www.openkb.info/2016/02/difference-between-spark-hivecontext.html


推荐阅读