![](/img/trans.png)
[英]Pyspark replace strings in Spark dataframe column by using values in another column
[英]Pyspark replace values on array column based on another dataframe
我有兩個數據框,一個只是帶有一些具有關聯names
的唯一ids
,如下所示:
Id name
0 name_a
1 name_b
2 name_c
第二個 dataframe 包含存儲在數組中的第一個 dataframe 的 id,在每一行中:
Row_1 row_2
0 [0,2]
1 [1,0]
我的問題是可以從第二個 dataframe 替換 arrays ,因此它會根據ids
檢查第一個 df 的names
,所以:
Row_1 row_2
0 [name_a, name_c]
1 [name_b, name_a]
創建第一個 df 的 map 並使用 udf 將其添加到第二個 df 似乎太耗時了。 非常感謝任何有關如何解決此問題的幫助。
您可以嘗試使用explode function 將數組轉換為行,然后將數據與初始數據框連接起來,在最后一步通過 &.agg(collect_list()) 進行分組
from pyspark.sql.functions import explode
df3 = df2.select(df2.row_1,explode(df2.row_2))
df4 = df3.join(df1,df3.row_1==df1.Id).select(df3.row_1,df1.name)
df5 = df4.groupBy('row_1').agg(collect_list('name').alias('name'))
參考鏈接:
使用array_contains
function + groupby 和collect_list
加入:
from pyspark.sql import functions as F
df1 = spark.createDataFrame([(0, "name_a"), (1, "name_b"), (2, "name_c")], ["Id", "name"])
df2 = spark.createDataFrame([(0, [0, 2]), (1, [1, 0])], ["Row_1", "Row_2"])
result = df2.join(
df1, on=F.array_contains("Row_2", F.col("Id")), how="left"
).groupBy("Row_1").agg(
F.collect_list("name").alias("Row_2")
)
result.show()
#+-----+----------------+
#|Row_1| Row_2|
#+-----+----------------+
#| 0|[name_a, name_c]|
#| 1|[name_a, name_b]|
#+-----+----------------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.