创建包含n个其他列表中的比例数据的列表

时间:2017-09-11 02:58:43

标签: python apache-spark

PySpark编程新手。我一直在尝试这个问题,想知道是否有更有效的方法来解决它 我有15个数据框,每个数据框包含2列:网站名称和点击数。这些数据帧中的每一个都具有不同数量的记录。我想要一个最终的数据帧,在那里我从每个数据帧中获取最高记录(基于命中)并在那里添加它们。问题是,我从每个记录中获取了相应数量的记录。因此,例如,如果我最终想要1500条记录,并且我只有2条大小为10,000和5000的数据帧,我将从第一个获取1000,从第二个获取500。

目前,我有一个这样的实现:
1.在每个数据帧上调用count()。现在我有每个数据帧的长度,所以我可以确定每个数据帧需要多少条记录 2.根据匹配,在每个数据帧上调用orderBy()。然后在有序数据帧上调用limit(),这样我就可以将其限制为每个数据帧所需的记录总数。

上述实施方式有效,但速度很慢。这听起来也像是一种非常贪婪的方法,所以我会欣赏任何暗示让这更好的方法。谢谢!

1 个答案:

答案 0 :(得分:0)

虽然您仍需要遍历数据框列表,但您的方法似乎是正确的。我们可以尝试这种方法来并行化计算:

首先让我们创建不同长度的样本数据帧:

import random
length_list = [10, 15, 20, 30]
df_list = []
for l in length_list:
    df = spark.createDataFrame(
        sc.parallelize([[chr(ord("a") + i), random.randint(0, 100), l] for i in range(l)]), 
        ["name", "hits", "df_name"]
    )
    df_list.append(df)

请注意,我创建了一个名为包含数据帧长度的列。

我们会创建所有数据框的union,只有一个工作表:

from functools import reduce
from pyspark.sql import DataFrame
df = reduce(DataFrame.unionAll, df_list)

现在,我们将使用percent_rank

计算每个df_name组中的Window
from pyspark.sql import Window
w = Window.partitionBy("df_name").orderBy(psf.desc("hits"))
df = df.withColumn("pct_rn", psf.percent_rank().over(w))

您现在可以过滤所需的每个组中所占比例的数据框,例如1/3

res = df.filter(df.pct_rn < 1/3.)

最后检查最终长度是原始长度的1/3:

res.groupBy("df_name").count().sort("df_name").show()

+-------+-----+
|df_name|count|
+-------+-----+
|     10|    3|
|     15|    6|
|     20|    7|
|     30|   10|
+-------+-----+