Gid*_*eon 1 performance apache-spark apache-spark-sql spark-dataframe
我正在开发一个 Spark 程序,它计算每个用户的概率,从而产生一个相对较大的数据帧(~137.5M 行)。我需要做的是取这些用户的前 10%(10 个是任意的,当然可以更改)并将它们保存到文件中。
一个最小化的例子是:
hc.sparkContext.parallelize(Array(("uid1", "0.5"), ("uid2", "0.7"), ("uid3", "0.3"))).toDF("uuid", "prob")所以我的问题是:使用相对较大的数据框来做到这一点的干净有效的方法是什么?
可以计算输入数据帧的 10% 有多少用户,然后使用 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|
+----+----+----+
Run Code Online (Sandbox Code Playgroud)
数据:
df = sc.parallelize([("uid1", "0.5"),
("uid2", "0.7"),
("uid3", "0.3")]).toDF(["uuid", "prob"])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3574 次 |
| 最近记录: |