對于計算,我已經創建了這個資料框
df1:
-------------- ------ ------------
|name |MG |questions |
-------------- ------ ------------
|toto |MG1 |[Q1, Q2] |
|toto |MG3 |[Q4, Q6, Q7]|
|toto-123 |MG1 |[Q1, Q2] |
|toto-456 |MG1 |[Q1, Q2] |
|titi |MG1 |[Q1, Q2] |
|... |... |... |
-------------- ------ ------------
到現在為止,這已經足夠了,但是現在,對于一個新的需求,我遇到了一個我無法解決的問題:我必須將行分組,name而MG不是精確的name,而是類似的name,就像那樣
df1:
-------------- ------ -----------------------------
|name |MG |questions |
-------------- ------ -----------------------------
|toto |MG1 |[Q1, Q2] [Q1, Q2] [Q1, Q2] |
|toto |MG3 |[Q4, Q6, Q7] |
|titi |MG1 |[Q1, Q2] |
|... |... |... |
-------------- ------ -----------------------------
在這里,questionstoto 是對 的問題toto, toto-123 and toto-456。它們可以保留在不同的陣列中或相同的陣列中。理想情況下toto-123,toto-456仍然保留的行。
我已經嘗試了groupby帶有條件思考 SQL 運算式的函式,但沒有成功
您有任何提示或解決方案嗎?非常感謝
uj5u.com熱心網友回復:
您可以首先使用自連接查找具有相似name和mg值的行,like在連接條件中使用運算子:
import pyspark.sql.functions as F
df = spark.createDataFrame([
("toto", "MG1", ["Q1", "Q2"]), ("toto", "MG3", ["Q4", "Q6", "Q7"]),
("toto-123", "MG1", ["Q1", "Q2"]), ("toto-456", "MG1", ["Q1", "Q2"]),
("titi", "MG1", ["Q1", "Q2"])], ["name", "mg", "questions"])
similar_df = df.alias("a").join(
df.alias("b"),
F.expr("a.name like concat('%', b.name, '%') and a.mg = b.mg and a.name != b.name"),
).selectExpr("a.name", "a.mg", "b.name as similar_name")
similar_df.show()
# -------- --- ------------
#| name| mg|similar_name|
# -------- --- ------------
#|toto-123|MG1| toto|
#|toto-456|MG1| toto|
# -------- --- ------------
然后,再次加入原始資料框,并將對應名稱的值更改為第一步中找到的相似名稱,最后按name和分組mg收集questions:
result = df.alias("df").join(
similar_df.alias("s"),
["name", "mg"],
'left'
).select(
F.coalesce(F.col("similar_name"), F.col("df.name")).alias("name"),
F.col("mg"),
F.col("df.questions"),
).groupBy("name", "mg").agg(
F.collect_list("questions").alias("questions")
)
result.show(truncate=False)
# ---- --- ------------------------------
#|name|mg |questions |
# ---- --- ------------------------------
#|toto|MG1|[[Q1, Q2], [Q1, Q2], [Q1, Q2]]|
#|titi|MG1|[[Q1, Q2]] |
#|toto|MG3|[[Q4, Q6, Q7]] |
# ---- --- ------------------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/405137.html
標籤:
