1

2つのスパークデータフレームがあります。
データフレームA:2つのデータフレームを結合して新しいデータフレームに格納する

Col_A1  Col_A2 
1  ["x", "y", "z"] 
2  ["a", "x", "y"] 
3  ["a", "b", "c"] 

データフレームB:

Col_B1 
"x" 
"a" 
"y" 

私が持っている、と言う、そのCol_A2におけるデータフレームBの"x"、それが新規としてそれを返すデータフレームAのどのエントリをチェックしたいですデータフレームそのもの。

DATAFRAME A_X:

Col_A1  Col_A2 
1  ["x", "y", "z"] 
2  ["a", "x", "y"] 

DATAFRAME A_A:

Col_A1  Col_A2 
2  ["a", "x", "y"] 
3  ["a", "b", "c"] 
繰り返し私は

出力のようなものである必要があり、データフレームBのエントリの残りの部分のために同じことをやりたいです

データフレームA_y

Col_A1  Col_A2 
1  ["x", "y", "z"] 
2  ["a", "x", "y"] 

私はudfsとmap関数を使ってみましたが、私が探しているものは実際には得られませんでした。 ありがとうございます。

+0

データフレームBを 'collect()'することは可能ですか、それとも禁止的なほど大きいのですか? – desertnaut

+0

回答が役に立たない? – desertnaut

答えて

3

あなたのデータフレームBが小さいと、リストに収集することができ、加えてその個別値の数が小さなであることを、あなたはその要素のそれぞれについて、簡単なUDF [UPDATE書くことができ場合:の最後を参照簡単な方法でポストする];ここ'x'の例です:

spark.version 
# u'2.2.0' 

from pyspark.sql import Row 

df_a = spark.createDataFrame([Row(1, ["x", "y", "z"]), 
           Row(2, ["a", "x", "y"]), 
           Row(3, ["a", "b", "c"])], 
           ["col_A1", "col_A2"]) 

@udf('boolean') 

def x_isin(v): 
    if 'x' in v: 
    return True 
    else: 
    return False 

temp_x = df_a.withColumn('x_isin', x_isin(df_a.col_A2)) 
temp_x.show() 
# +------+---------+------+ 
# |col_A1| col_A2|x_isin| 
# +------+---------+------+ 
# |  1|[x, y, z]| true| 
# |  2|[a, x, y]| true| 
# |  3|[a, b, c]| false| 
# +------+---------+------+ 

df_a_x = temp_x.filter(temp_x.x_isin==True).drop('x_isin') 
df_a_x.show() 
# +------+---------+ 
# |col_A1| col_A2| 
# +------+---------+ 
# |  1|[x, y, z]| 
# |  2|[a, x, y]| 
# +------+---------+ 

UPDATE(マリーさんのコメントの後):array_contains機能を指摘してマリーに

おかげで - 今、あなたが実際にtemp_xを構築するためにUDFを必要としません:

+2

pyspark sqlモジュールには、 'UDF'と同じことをする' array_contains'という関数があります。 – MaFF

+0

@マリー・オオプスス...キャッチ - クレジットで更新された答え: – desertnaut

+1

喜んで私の背中を持っている回答者を助けることができます:) – MaFF

関連する問題