gpt4 book ai didi

performance - 如何从相对较大的 Spark 数据框中获取最高百分比并将其保存到文件中

转载 作者:行者123 更新时间:2023-12-05 08:56:25 26 4
gpt4 key购买 nike

我正在开发一个 Spark 程序,该程序计算每个用户的概率,从而产生相对较大的数据帧(约 1.375 亿行)。我需要做的是将这些用户中的前 10%(10 个是任意的,当然可以更改)保存到文件中。

一个最小化的例子是:

  • 给定此数据帧:hc.sparkContext.parallelize(Array(("uid1", "0.5"), ("uid2", "0.7"), ("uid3", "0.3")))。 toDF("uuid", "prob")
  • 并给定阈值 0.3
  • 我希望输出为 ("uid2", "0.7") 并保存到文件 "output"中,因为 "uid2"的概率最高,我只需要从数据框中提取前 0.3% 的用户

所以我的问题是:用相对较大的数据框执行此操作的简洁高效方法是什么?

可以计算输入数据帧的 10% 有多少用户,然后使用 top 和大小。但是我对此有两个担忧:

  1. 当使用 top 时 - 数据是否在洗牌之前首先被减少,方法是从每个执行程序中取出前 10%,然后从洗牌后的数据中取出 10%?如果没有,是否有内置的方法来执行我的建议?还是我应该自己实现?
  2. Top 返回一个仍然相当大的数组...我更愿意做的是将其保留为数据框并仅保存其输出(可能在洗牌后重新分区数据)。有什么方法可以在不将其转换为数组然后并行化的情况下执行此操作?

如果需要,我不介意使用 RDD 而不是数据帧

我目前使用的是 Spark 1.6.1

提前致谢

最佳答案

您可以使用窗口函数 percent_rank()。但是,因为您不是按组排名,所以您将无法使用 partitionBy() 并行化操作。这是 pySpark 中的示例:

from pyspark.sql.window import Window
from pyspark.sql.functions import percent_rank, col

window = Window.partitionBy().orderBy(df['prob'].desc())

df.select('*', percent_rank().over(window).alias('rank'))
.filter(col('rank') <= 0.3) # top 30% for example
.show()
+----+----+----+
|uuid|prob|rank|
+----+----+----+
|uid2| 0.7| 0.0|
+----+----+----+

数据:

df = sc.parallelize([("uid1", "0.5"), 
("uid2", "0.7"),
("uid3", "0.3")]).toDF(["uuid", "prob"])

关于performance - 如何从相对较大的 Spark 数据框中获取最高百分比并将其保存到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40885266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com