PySpark-如果值出现在两个字段匹配的另一个数据帧上,则将值返回到数据帧中



很抱歉标题含糊不清,我想不出更好的表达方式了。我了解一些python,对Pandas数据帧也有一些经验,但最近我被指派研究一些涉及Spark的东西,我正在努力取得进展。

我想最好的解释方法是用一个小例子。假设我有数据帧A:

id | Name    |
--------------
1  | Random  |
2  | Random  |
3  | Random  |

以及数据帧B:

id | Fruit  |
-------------
1  | Pear   |
2  | Pear   |
2  | Apple  |
2  | Banana |
3  | Pear   |
3  | Banana |

现在我要做的是将数据帧A与B匹配(基于id匹配),并遍历数据帧B中的Fruit列。如果出现一个值(比如Banana),我想将其作为列添加到数据帧中。可以是一个简单的和(每次香蕉出现在一列上加1),或者如果它出现一次,就把它分类。例如,一个输出可能是这样的:

id | Name    | Banana
---------------------
1  | Random  | 0
2  | Random  | 1
3  | Random  | 1

我的问题是迭代Spark数据帧,以及如果匹配发生,如何连接两者。我正试图做一些这样的事情:

def fruit(input):
fruits = {"Banana" : "B"}
return fruits[input]
fruits = df.withColumn("Output", fruit("Fruit"))

但它并没有真正起作用。有什么想法吗?提前道歉我在Spark的经验很少。

希望这能有所帮助!

#sample data
A = sc.parallelize([(1,"Random"), (2,"Random"), (3,"Random")]).toDF(["id", "Name"])
B = sc.parallelize([(1,"Pear"), (2,"Pear"), (2,"Apple"), (2,"Banana"), (3,"Pear"), (3,"Banana")]).toDF(["id", "Fruit"])
df_temp = A.join(B, A.id==B.id, 'inner').drop(B.id)
df = df_temp.groupby(df_temp.id, df_temp.Name).
pivot("Fruit").
count().
na.fill(0)
df.show()

输出为

+---+------+-----+------+----+
| id|  Name|Apple|Banana|Pear|
+---+------+-----+------+----+
|  1|Random|    0|     0|   1|
|  3|Random|    0|     1|   1|
|  2|Random|    1|     1|   1|
+---+------+-----+------+----+

编辑说明:如果你只对少数水果感兴趣,那么

from pyspark.sql.functions import col
#list of fruits you are interested in
fruit_list = ["Pear", "Banana"]
df = df_temp.
filter(col('fruit').isin(fruit_list)).
groupby(df_temp.id, df_temp.Name).
pivot("Fruit").
count().
na.fill(0)
df.show()

+---+------+------+----+
| id|  Name|Banana|Pear|
+---+------+------+----+
|  1|Random|     0|   1|
|  3|Random|     1|   1|
|  2|Random|     1|   1|
+---+------+------+----+

相关内容

  • 没有找到相关文章

最新更新