如何解决在 pyspark 中创建 2 个数据框之间的关系
我正在尝试按如下方式创建映射:
df_input_1
:这是一个分组数据
+------+------+
|Hier_1|Hier_2|
+------+------+
| Jim| Pan|
| Tak| Can|
| Pac| Dan|
| Foe| Man|
| Yat| Van|
+------+------+
df_output_1
:应用逻辑后创建
+---+---------+--------------------+---+
| Sr|Parent_Sr| Name| ID|
+---+---------+--------------------+---+
|123| NA|Jim is father of Pan|Jim|
|456| NA|Tak is father of Can|Tak|
|789| NA|Pac is father of Dan|Pac|
|143| NA|Foe is father of Man|Foe|
|457| NA|Yat is father of Van|Yat|
+---+---------+--------------------+---+
df_output_2
:使用另一个输入后的第二个数据帧。
+---+---------+--------------------+---+
| Sr|Parent_Sr| Name| ID|
+---+---------+--------------------+---+
|998| NA|Pan is father of Fen|Pan|
|887| NA|Can is father of Den|Can|
|776| NA|Dan is father of Qen|Dan|
|665| NA|Man is father of Men|Man|
|554| NA|Van is father of Ren|Van|
+---+---------+--------------------+---+
预期df_output_2
:
先生 | Parent_Sr | 姓名 | ID |
---|---|---|---|
998 | 123 | 潘是芬的父亲 | 平底锅 |
887 | 456 | Can是Den的父亲 | 可以 |
776 | 789 | 丹是秦的父亲 | 丹 |
665 | 143 | 人是人之父 | 男人 |
554 | 457 | Van 是 Ren 的父亲 | 货车 |
Sr
列中的值将始终是唯一的且不按顺序排列。我已经能够在 python 中解决这个问题,如下所示:
这有效:
df_output_1_2 = df_output_1.drop_duplicates(subset=['ID'])
mapping = pd.Series(df_output_1_2['Sr'].values,index=df_output_1_2['ID'])
df_output_2['Parent_Sr'] = df_output_2['Parent_Sr'].fillna(df_output_2['ID'].map(mapping))
重要的问题还在于仅填充 Parent_Sr
中的空白条目。
不确定如何在 pyspark 中完成此操作。
解决方法
你的问题不是很清楚。但是根据显示的输入和所需的输出,我相信您想要的只是在 df_output_2
上加入 df_input_1
和 ID = Hier_2
以获得 ID
之间的关系,然后加入df_output_1
在 ID = Hier_1
上获取 Sr
值:
df_output_2 = df_output_2.alias("out2").join(
df_input_1.alias("in1"),col("out2.ID") == col("in1.Hier_2"),"left"
) \
.join(
df_output_1.alias("out1"),col("out1.ID") == col("in1.Hier_1"),"left"
) \
.selectExpr("out2.Sr","coalesce(out2.Parent_Sr,out1.Sr) as Parent_Sr","out2.name","out2.ID")
df_output_2.show()
#+---+---------+--------------------+---+
#| Sr|Parent_Sr| name| ID|
#+---+---------+--------------------+---+
#|998| 123|Pan is father of Fen|Pan|
#|665| 143|Man is father of Men|Man|
#|887| 456|Can is father of Den|Can|
#|554| 457|Van is father of Ren|Van|
#|776| 789|Dan is father of Qen|Dan|
#+---+---------+--------------------+---+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。