web-dev-qa-db-ja.com

Pysparkは別のデータフレームの列でデータフレームをフィルターします

なぜ私がこれで苦労しているのかはわかりませんが、Rやパンダで行うのはかなり簡単であることを考えると、とても簡単に思えます。私はpandasを使用することを避けたかったのですが、私は多くのデータを扱っているため、toPandas()はpysparkのドライバーのメモリにすべてのデータをロードすると考えています。

df1df2の2つのデータフレームがあります。 df1およびdf1.userid = df2.useridであるdf1.group = df2.group(すべての行を削除する)をフィルターしたい。 filter()join()、またはsqlのいずれを使用すべきかはわかりませんでした。例:

df1:
+------+----------+--------------------+
|userid|   group  |      all_picks     |
+------+----------+--------------------+
|   348|         2|[225, 2235, 2225]   |
|   567|         1|[1110, 1150]        |
|   595|         1|[1150, 1150, 1150]  |
|   580|         2|[2240, 2225]        |
|   448|         1|[1130]              |
+------+----------+--------------------+

df2:
+------+----------+---------+
|userid|   group  |   pick  |
+------+----------+---------+
|   348|         2|     2270|
|   595|         1|     2125|
+------+----------+---------+

Result I want:
+------+----------+--------------------+
|userid|   group  |      all_picks     |
+------+----------+--------------------+
|   567|         1|[1110, 1150]        |
|   580|         2|[2240, 2225]        |
|   448|         1|[1130]              |
+------+----------+--------------------+

編集:私は多くのjoin()とfilter()関数を試しましたが、私が得た最も近いものは信じていました:

cond = [df1.userid == df2.userid, df2.group == df2.group]
df1.join(df2, cond, 'left_outer').select(df1.userid, df1.group, df1.all_picks) # Result has 7 rows

さまざまな種類の結合を試し、さまざまなcond値も試しました:cond =((df1.userid == df2.userid)&(df2.group == df2.group))#result has 7行cond =((df1.userid!= df2.userid)&(df2.group!= df2.group))#結果には2行があります

ただし、結合では削除ではなく追加の行が追加されているようです。

python 2.7spark 2.1.0を使用しています

21
drewyupdrew

左アンチ結合はあなたが探しているものです:

df1.join(df2, ["userid", "group"], "leftanti")

ただし、左外部結合でも同じことができます。

(df1
    .join(df2, ["userid", "group"], "leftouter")
    .where(df2["pick"].isNull())
    .drop(df2["pick"]))
38
user6910411