PySpark - 如果值出现在两个字段匹配的另一个数据帧上,则将值返回到数据帧中
PySpark - Returning a value into a dataframe, if a value occurs on another dataframe where two fields match
抱歉,标题含糊不清,我想不出更好的表达方式。我了解一点 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),我想添加它作为数据框的一列。可以是一个简单的求和(每次出现 banana 时将 1 添加到列中),或者如果它出现一次则只是 class。因此,例如,输出可能如下所示:
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|
+---+------+------+----+
抱歉,标题含糊不清,我想不出更好的表达方式。我了解一点 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),我想添加它作为数据框的一列。可以是一个简单的求和(每次出现 banana 时将 1 添加到列中),或者如果它出现一次则只是 class。因此,例如,输出可能如下所示:
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|
+---+------+------+----+