我有一個包含 2 列的表:一個 ID (uuid) 和一個值 (int)。我想添加一個第三列,它是一個組。我想將行分成 3 個組,這些組的大小由唯一的 id 值相等。
例如,假設我有 99 個唯一 ID,總共 200 行。分配組后,最終可能會有一個組分配給 33 行,另一個分配給 100 行,第三個分配給 67 行。但是,所有 3 個組應該有相同數量 (33) 的唯一 ID。
Example dataset:
id -> assigned group
---------------------
abc -> group a
def -> group b
ghi -> group c
jkl -> group a
mno -> group b
pqr -> group c
...
Original Table: Updated table:
id(uuid) | val id(uuid) | val | group
----------- --------- --> --------- ----- ---------
abc | 1 abc | 1 | a
pqr | 1 pqr | 1 | c
abc | 2 abc | 3 | a
mno | 5 mno | 5 | b
def | 1 def | 1 | b
mno | 3 mno | 3 | b
def | 4 def | 4 | b
pqr | 3 pqr | 3 | c
ghi | 5 ghi | 5 | c
jkl | 1 jkl | 1 | a
mno | 4 mno | 4 | b
jkl | 6 jkl | 6 | a
def | 3 def | 3 | b
mno | 2 mno | 2 | b
...
Rows: 14
Num buckets: 3 [a, b, c]
Bucket a --> ids: 2, rows: 4
Bucket b --> ids: 2, rows: 7
Bucket c --> ids: 2, rows: 3
uj5u.com熱心網友回復:
你可以分兩步做到這一點。
- 首先,提取所有唯一 id 并將它們中的每一個與索引 K 相關聯,索引 K 范圍從 1 到唯一 id 的數量(或 0 到該數字減 1)。然后,分配的組是該索引模 3。
- 您將該結果加入原始資料框,然后您就有了結果。
# Step 1
groups = df\
.select("id(uuid)")
.distinct()
.rdd.map(lambda x: x[0])
.zipWithIndex()
.mapValues(lambda x : x % 3)
.toDF(["id(uuid)", "group"])
groups.show()
產生:
-------- -----
|id(uuid)|group|
-------- -----
| pqr| 0|
| jkl| 1|
| ghi| 2|
| mno| 0|
| abc| 1|
| def| 2|
-------- -----
進而:
# Step 2
result = df.join(groups, 'id(uuid)')
注意,如果您希望組的名稱與整數不同,您可以簡單地創建一個組映射,如下所示:
group_map = [ (0, 'a'), (1, 'b'), (2, 'c') ]
group_map_df = spark.createDataFrame(group_map, ['group', 'new_group'])
new_result = result.join(group_map_df, ['group'])
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/465520.html
