微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 pyspark 中创建 2 个数据框之间的关系

如何解决在 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_1ID = Hier_2 以获得 ID 之间的关系,然后加入df_output_1ID = 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?