簡體   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