在 PySpark 中,如何根据另一个 DataFrame 中的查找来填充新列?

Posted

技术标签:

【中文标题】在 PySpark 中,如何根据另一个 DataFrame 中的查找来填充新列?【英文标题】:In PySpark, how can I populate a new column based on a lookup in another DataFrame? 【发布时间】:2019-06-18 03:58:42 【问题描述】:

Spark 和 PySpark 的新手,我正在尝试通过在另一个 DataFrame 中查找信息来在 DataFrame 中添加一个字段/列。在过去的几个小时里,我一直在尝试阅读 RDD、DataFrames、DataSets、maps、joins 等,但这些概念对我来说仍然是新的,我仍然很难完全理解它们。

例如,给定以下带有 ID 和角色的输入 DataFrame:

+----+-------------+
| ID | Role        |
+----+-------------+
|  1 | Author      |
|  1 | Editor      |
|  2 | Author      |
|  2 | Publisher   |
|  3 | Editor      |
|  3 | Assistant   |
+----+-------------+

还有另一个具有唯一 ID 和名称映射的输入 DataFrame:

+----+-------------+
| ID | Name        |
+----+-------------+
|  1 | John Smith  |
|  2 | John Doe    |
|  3 | Bob Jim Bob |
+----+-------------+

我需要以某种方式将此数据合并到单个输出 DataFrame 中,并添加 Name 列,如下所示:

+----+-------------+-------------+
| ID | Name        | Role        |
+----+-------------+-------------+
|  1 | John Smith  | Author      |
|  1 | John Smith  | Editor      |
|  2 | John Doe    | Author      |
|  2 | John Doe    | Publisher   |
|  3 | Bob Jim Bob | Editor      |
|  3 | Bob Jim Bob | Assistant   |
+----+-------------+-------------+

两个输入表的实际数据量约为 200k+ 行。

我最初的想法是在 ID + Role 表中添加一个新的 Name 列,然后遍历每一行并手动从 ID + Name 表中查找 Name 但这真的很慢,而且我肯定无法利用Spark 的优势。

再一次,对这一切仍然很陌生,所以如果这是一个非常明显的问题,请原谅我。

谢谢!

【问题讨论】:

看到这个***.com/questions/40343625/… 【参考方案1】:

您可以在 pySpark 中合并两个 dataframeS,如下所示:

>>> df1.show()
+---+---------+
| ID|     Role|
+---+---------+
|  1|   Author|
|  1|   Editor|
|  2|   Author|
|  2|Publisher|
|  3|   Editor|
|  3|Assistant|
+---+---------+

>>> df2.show()
+---+-----------+
| ID|       Name|
+---+-----------+
|  1| John Smith|
|  2|   John Doe|
|  3|Bob Jim Bob|
+---+-----------+

>>> df3 = df2.join(df1,"ID")
>>> df3.show()
+---+-----------+---------+
| ID|       Name|     Role|
+---+-----------+---------+
|  1| John Smith|   Author|
|  1| John Smith|   Editor|
|  2|   John Doe|   Author|
|  2|   John Doe|Publisher|
|  3|Bob Jim Bob|   Editor|
|  3|Bob Jim Bob|Assistant|
+---+-----------+---------+

注意:我假设"ID" 为外键,请注释掉以防万一 有任何顾虑。

【讨论】:

是的,ID 是外键。

以上是关于在 PySpark 中,如何根据另一个 DataFrame 中的查找来填充新列?的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:如何根据另一列中的匹配值从数组中的第一次出现中选择直到最后的值

Pyspark:如何根据另一列的值填充空值

PYSPARK:根据条件用另一个行值更新一行中的值?

Pyspark:如果具有特定 id 的任何行包含 null,如何根据另一列派生新列的值?

根据另一列的元素从 pyspark 数组中删除元素

根据另一个数据帧过滤 pyspark 数据帧