2017-10-12 29 views
0

曖昧なタイトルをお詫び申し上げます。私はPythonのビットを理解し、パンダのデータフレームでいくつかの経験を持っていますが、最近私はSparkに関係するものを見るように任されており、私はそれを前に進めるために苦労しています。PySpark - 2つのフィールドが一致する別のデータフレームで値が返された場合、データフレームに値を返す

これを説明する最善の方法は、小さな例があると思います。

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

と同様にデータフレームB:私はデータフレームのAを持っている想像し

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

今、私がやろうとしているがBとマッチデータフレームA(IDマッチングに基づく)で、かつ反復処理データフレームBのFruitカラム。値が上がった場合(Banana)、データフレームにカラムとして追加します。単純な合計(毎回バナナが来るたびに1が列に追加されます)か、それが一度起きればクラスになります。したがって、たとえば、出力は次のようになります。

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

私の問題は、Sparkデータフレームを反復処理し、どのようにマッチが発生した場合、私は2を接続することができています。私はこの効果のために何かをしようとしていた:

def fruit(input): 

    fruits = {"Banana" : "B"} 

    return fruits[input] 

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

それは実際には機能していない。何か案は?あらかじめお詫び申し上げます。私のスパーク体験はごくわずかです。

答えて

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

おかげで、本当に便利!クイックフォローアップの質問では、カラム全体の値ではなく、カラムの値に基づいてピボットフィールドをどのように数えることができるか知っていますか?上記の例では、いくつかの成果が得られましたが、実際のコンテキストでは何千もの値があり、興味があるのはif文のようなものです – rubs90

+0

助けてくれてうれしい! Plsはあなたのフォローアップの質問への答えのための私の上記の更新をチェックします。 – Prem

関連する問題