なぜ私がこれで苦労しているのかはわかりませんが、Rやパンダで行うのはかなり簡単であることを考えると、とても簡単に思えます。私はpandasを使用することを避けたかったのですが、私は多くのデータを扱っているため、toPandas()
はpysparkのドライバーのメモリにすべてのデータをロードすると考えています。
df1
とdf2
の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.7
とspark 2.1.0
を使用しています
左アンチ結合はあなたが探しているものです:
df1.join(df2, ["userid", "group"], "leftanti")
ただし、左外部結合でも同じことができます。
(df1
.join(df2, ["userid", "group"], "leftouter")
.where(df2["pick"].isNull())
.drop(df2["pick"]))