繁体   English   中英

创建包含来自其他n个列表的按比例数量的数据的列表

[英]Create list containing proportionate number of data from n other lists

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

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

上面的实现有效,但速度很慢。 这听起来也很贪婪,所以希望能有任何改进的提示。 谢谢!

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

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

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|
+-------+-----+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM