Pyspark连接两个 Dataframe ,df1具有查找数据,df2具有数组,从查找键中查找相应的值并在df2中创建值数组

xkrw2x1b  于 2023-06-21  发布在  Spark
关注(0)|答案(1)|浏览(109)

Pyspark Dataframe API

给定两个 Dataframe A和B,其中:

数据框A:

| id|姓名|
| - -----|- -----|
| ABC-2|约翰|
| 血脑屏障-1|彼得|
| def-y|金|
| xyz-0|布拉德|

数据框B:

| id_list|
| - -----|
| “abc-2”,“bbb-1”|
| “ABC-2”|
| “abc-2”,“xyz-0”|
最后的dataframe应该是:

数据框B:

| id_list|用户|
| - -----|- -----|
| “abc-2”,“bbb-1”|约翰,彼得|
| “ABC-2”|约翰|
| abc-2,xyz-0|布拉德?约翰|
我如何使用Pyspark dataframe API来实现这个结果?

u3r8eeie

u3r8eeie1#

  • 使用split(col(“id_list”),“,”)在逗号上拆分df_B中的“id_list”列,然后使用explode()为拆分后的每个元素生成一行。分解的元素存储在称为“id”的新列中。
  • 使用df_a.id == df_b. id左连接df_a和“id”列上修改后的df_b。结果存储在joined_df中。
  • 将joined_df按“id_list”列分组,并使用collect_list(“names”)聚合“names”列。生成的聚合使用别名(“users”)存储在名为“users”的新列中。

代码:

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, split, explode, collect_list, concat_ws
spark = SparkSession.builder.getOrCreate()
data_a = [("abc-2", "John"), ("bbb-1", "Peter"), ("def-y", "Kim"), ("xyz-0", "Brad")]
df_a = spark.createDataFrame(data_a, ["id", "names"])
data_b = [("abc-2,bbb-1",), ("abc-2",), ("abc-2,xyz-0",)]
df_b = spark.createDataFrame(data_b, ["id_list"])
 
df_b = df_b.withColumn("id", explode(split(col("id_list"), ",")))
joined_df = df_b.join(df_a, df_a.id == df_b.id, "left")
final_df = joined_df.groupby("id_list").agg(concat_ws(",", collect_list("names")).alias("users"))
final_df = final_df.withColumn("users", final_df["users"].cast("string"))
final_df.display(truncate=False)

相关问题