很抱歉标题含糊不清,我想不出更好的表达方式了。我了解一些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|
+---+------+------+----+