簡體   English   中英

PySpark:如何獲取列的所有組合

[英]PySpark: how to get all combinations of columns

我有一個包含批次、輸入和輸出組合的 DF,我希望能夠將它們的“獨特組合”添加回 DataFrame。 數據的簡單表示如下所示:

輸出 輸入
1 一個 X
1 一個
1 一個 Z
2 一個 X
2 一個
2 一個 Z
3 一個
3 一個
3 一個 Z
4 一個 W
4 一個
4 一個 Z

所以你可以看到有 4 個批次和 3 種不同的輸入組合來產生相同的輸出類型,我想最終得到的是:

輸出 輸入 組合
1 一個 X 1
1 一個 1
1 一個 Z 1
2 一個 X 1
2 一個 1
2 一個 Z 1
3 一個 2
3 一個 2
3 一個 Z 2
4 一個 W 3
4 一個 3
4 一個 Z 3

我希望在 PySpark 中實現這一點以進行進一步的數據操作,任何指導將不勝感激:)

編輯:仍然不優雅,但它在 PySpark 中有效! 我確信必須有一種更簡單的方法來使用集合或字典來做到這一點,我的大腦只是拒絕讓我看到它......

df = spark.createDataFrame(
    [
        (1,'A','X'),
        (1,'A','Y'),
        (1,'A','Z'),
        (2,'A','X'),
        (2,'A','Y'),
        (2,'A','Z'),
        (3,'A','V'),
        (3,'A','Y'),
        (3,'A','Z'),
        (4,'A','W'),
        (4,'A','Y'),
        (4,'A','Z'),
        (5,'B','X'),
        (5,'B','Y'),
        (5,'B','Z')
    ],
    ["Batch", "Output", "Input"]
)

grouped = df.orderBy("Input").groupBy(["Batch", "Output"]).agg(f.concat_ws('_', f.sort_array(f.collect_list("Input"))).alias("Comb"))
grouped = grouped.withColumn("TotalComb", f.concat_ws('_',grouped.Output, grouped.Comb))
w = Window.partitionBy().orderBy(f.col('TotalComb').asc())
groupunique = grouped[["totalComb"]].distinct().withColumn("UniqueComb", f.row_number().over(w))
connected = df.join(grouped, on = ["Batch", "Output"], how = "left").join(groupunique, on = ["totalComb"], how = "left")

創建一個輸入列表,按該列表分類,找到連續的差異並使用它們創建值以對整個 df 進行累積求和

w=Window.partitionBy("Batch","Output").orderBy("Batch")

df1=(df.withColumn('Combination',collect_set("Input").over(w))
     .withColumn('Combination',sum(when(lag('Output').over(Window.partitionBy("Combination",'Output').orderBy("Batch")).isNull(),1)
     .otherwise(0)).over(Window.partitionBy().orderBy('Batch')))).show()

+-----+------+-----+-----------+
|Batch|Output|Input|Combination|
+-----+------+-----+-----------+
|    1|     A|    X|          1|
|    1|     A|    Y|          1|
|    1|     A|    Z|          1|
|    2|     A|    X|          1|
|    2|     A|    Y|          1|
|    2|     A|    Z|          1|
|    3|     A|    V|          2|
|    3|     A|    Y|          2|
|    3|     A|    Z|          2|
|    4|     A|    W|          3|
|    4|     A|    Y|          3|
|    4|     A|    Z|          3|
|    5|     B|    X|          4|
|    5|     B|    Y|          4|
|    5|     B|    Z|          4|
+-----+------+-----+-----------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM