我想對火花資料框進行操作。例如,有一個包含兩列的資料框。
-------------------- --------------------
| key| value|
-------------------- --------------------
|1 |Bob |
|2 |Bob |
|3 |Alice |
|4 |Alice |
|5 |Alice |
............
列值中有兩種名稱,并且 Alice 的數量大于 Bob,我要修改的是洗掉一些包含Alice的行,使Alice所在的行數與Bob所在的行相同。該行應該被隨機洗掉,但我發現沒有支持這種操作的 API。我應該怎么做才能將行洗掉到特定數字?
uj5u.com熱心網友回復:
也許您可以將 sparkwindow函式與row_count后續過濾一起使用,如下所示:
>>> df.show(truncate=False)
--- -----
|key|value|
--- -----
|1 |Bob |
|2 |Bob |
|3 |Alice|
|4 |Alice|
|5 |Alice|
--- -----
>>> from pyspark.sql import Window
>>> from pyspark.sql.functions import *
>>> window = Window.orderBy("value").partitionBy("value")
>>> df2 = df.withColumn("seq",row_number().over(window))
>>> df2.show(truncate=False)
--- ----- ---
|key|value|seq|
--- ----- ---
|1 |Bob |1 |
|2 |Bob |2 |
|3 |Alice|1 |
|4 |Alice|2 |
|5 |Alice|3 |
--- ----- ---
>>> N = 2
>>> df3 = df2.where("seq <= %d" % N).drop("seq")
>>> df3.show(truncate=False)
--- -----
|key|value|
--- -----
|1 |Bob |
|2 |Bob |
|3 |Alice|
|4 |Alice|
--- -----
>>>
uj5u.com熱心網友回復:
這是您的 sudo 代碼:
- 數“鮑勃”
- [重新磁區資料]/[groupby] (partionBy/GroupBy)
- [使用迭代在“BOB”計數處截斷資料] (mapParitions/mapGroups)
您必須記住,從技術上講,spark 并不能保證資料集的排序,因此添加新資料可以隨機更改資料的順序。所以你可以考慮這個隨機的,并在你完成后減少計數。這應該比創建視窗更快。如果你真的覺得有必要,你可以創建自己的隨機概率函式來回傳每個磁區的一小部分。
您也可以使用一個視窗,paritionBy("value").orderBy("value")并使用row_count&where將磁區過濾為“Bob's”計數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/479939.html
標籤:阿帕奇火花 pyspark apache-spark-sql
