2017-10-12 34 views
0

對於模糊的標題,我想不出一個更好的方式來表達它。我對Python有點了解,並且對Pandas數據框有一些經驗,但是最近我被委託來看看涉及Spark的東西,並且我正在努力讓它領先於它。PySpark - 如果在兩個字段匹配的另一個數據框上出現值,則將值返回給數據框

我想最好的解釋方法是用一個小例子。想象一下,我有數據幀答:

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

除了數據幀B:

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

現在我想要做的是(根據ID匹配)與B匹配數據幀A,並通過迭代數據框B中的Fruit列。如果出現一個值(比如Banana),我想將它作爲列添加到數據框中。可能是一個簡單的總和(每次香蕉出現時都會在列中加1),或者如果它出現一次就分類。因此,例如,輸出看起來是這樣的:

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

我的問題是通過星火dataframes迭代,我怎麼能連接兩個如果匹配確實發生。我試圖做一些這樣的事情:

def fruit(input): 

    fruits = {"Banana" : "B"} 

    return fruits[input] 

fruits = df.withColumn("Output", fruit("Fruit")) 

但它不是真的工作。有任何想法嗎?事先道歉我的Spark經驗很少。

回答

0

希望這有助於!

#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| 
+---+------+------+----+ 
+0

感謝這個,真的有幫助!快速跟進問題,你知道我怎麼能基於列的值而不是整列自己來計算pivoted字段?在上面的例子中,我有一些成果,但在真正的情況下,我有成千上萬的值,我只對幾個感興趣,做一些事情就像if語句來計算只有當列的值匹配x – rubs90

+0

很高興它幫助!請檢查我的上述更新,以解答您的後續問題。 – Prem

相關問題