首页 > 解决方案 > 选择数据框中总和 = 50 的最大行数

问题描述

这是我的数据框

+--------------+-----------+------------------+
|           _c3|sum(number)|              perc|
+--------------+-----------+------------------+
|        France|    5170305|1.3201573334529797|
|       Germany|    9912088|2.5308982087190754|
|       Vietnam|   14729566| 3.760966630301244|
|United Kingdom|   19435674| 4.962598446648971|
|   Philippines|   21994132| 5.615861086093151|
|         Japan|   35204549| 8.988936539189615|
|         China|   39453426|10.073821498682275|
|     Hong Kong|   39666589|  10.1282493704753|
|      Thailand|   57202857|14.605863902228613|
|      Malaysia|   72364309| 18.47710593603423|
|     Indonesia|   76509597|19.535541048174547|
+--------------+-----------+------------------+

我只想选择乘客总数达到 50% 的顶级国家(国家、乘客人数、乘客百分比)。我该怎么做?

标签: apache-sparkapache-spark-sql

解决方案


您可以使用运行总计来存储累积百分比,然后按它进行过滤。因此,假设您的数据框足够小,应该这样做:

import org.apache.spark.sql.expressions.Window
val result = df.withColumn("cumulativepercentage", sum("perc").over(
                  Window.orderBy(col("perc").desc))
               ).where(col("cumulativepercentage").leq(50))
result.show(false)

推荐阅读