Pyspark-按组添加行

时间:2019-04-26 13:20:35

标签: apache-spark dataframe hadoop pyspark apache-spark-sql

在Pyspark 2.2中,我实质上是尝试按用户添加行。

如果我的主数据框如下所示:

main_list = [["a","bb",5], ["d","cc",10],["d","bb",11]]
main_pd = pd.DataFrame(main_list, columns = ['user',"group", 'value'])
main_df = spark.createDataFrame(main_pd)
main_df.show()

+----+-----+-----+
|user|group|value|
+----+-----+-----+
|   a|   bb|    5|
|   d|   cc|   10|
|   d|   bb|   11|
+----+-----+-----+

然后我有一个关键的数据框,我想让每个用户都有每个组值

用户d在组bbcc中有一行。我希望用户a具有相同的内容。

key_list = [["bb",10],["cc",17]]
key_pd = pd.DataFrame(key_list, columns = ['group', 'value'])
key_df = spark.createDataFrame(key_pd)

main_df.join(key_df, ["group"], how ="outer").show()

但是我的结果返回:

+-----+----+-----+-----+
|group|user|value|value|
+-----+----+-----+-----+
|   cc|   d|   10|   17|
|   bb|   a|    5|   10|
|   bb|   d|   11|   10|
+-----+----+-----+-----+

以下是每个数据框的架构:

main_df.printSchema()
root
 |-- user: string (nullable = true)
 |-- group: string (nullable = true)
 |-- value: long (nullable = true)

key_df.printSchema()
root
 |-- group: string (nullable = true)
 |-- value: long (nullable = true)

基本上,我希望结果是:

+-----+----+-----+-----+
|group|user|value|value|
+-----+----+-----+-----+
|   cc|   d|   10|   17|
|   bb|   a|    5|   10|
|   cc|   a| Null|   17|
|   bb|   d|   11|   10|
+-----+----+-----+-----+

我不认为完全外部联接可以通过coalesce完成此操作,因此我也尝试了row_number/rank

1 个答案:

答案 0 :(得分:1)

使用cross join获取所有用户组组合,然后在left join上使用maind_df生成丢失的行,然后使用key_df left join生成结果。 / p>

users = main_df.select("user").distinct()
groups = main_df.select("group").distinct()
user_group = users.crossJoin(groups)

all_combs = user_group.join(main_df, (main_df.user == user_group.user) & (main_df.group == user_group.group), "left").select(user_group.user,user_group.group,main_df.value)
all_combs.join(key_df, key_df.group == all_combs.group, "left").show()