pyspark v 1.6 dataframe нет левого анти-объединения? - PullRequest
0 голосов
/ 25 марта 2020

возможно, я совершенно неправильно понимаю вещи, но в основном у меня 2 dfs, и я не хочу получать все строки в df1, которых нет в df2, и я подумал, что именно это и сделает левое антисоединение, что, по-видимому, не поддерживается в pyspark v1.6?

df1:

+----+---+
| id | x |
+----+---+
| 1  | a |
| 2  | b |
| 3  | c |
| 4  | d |
+----+---+

df2:

+----+---+
| id | x |
+----+---+
| 1  | a |
| 2  | b |
+----+---+

desired output df3:

+----+---+
| id | x |
+----+---+
| 3  | c |
| 4  | d |
+----+---+

Я пытаюсь:

df3 = df1.where(~col("id").isin(df2["id"]))

, что дает мне .count () 0 строк

и :

df3 = df1.join(df2, on = ["id"], how = "leftanti")

для этого я получаю следующее исключение:

IllegalArgumentException: u"Unsupported join type 'leftanti'. Supported join types include: 'inner', 'outer', 'full', 'fullouter', 'leftouter', 'left', 'rightouter', 'right', 'leftsemi'."

Благодарю за помощь.

1 Ответ

1 голос
/ 25 марта 2020

Мы можем mimi c leftanti соединиться с left join и отфильтровать только нулевые столбцы из id в df2.

Example:

df1.alias("a").join(df2.alias("b"),col("a.id") == col("b.id"),"left").filter("b.id is null").select("a.*").show()
#+---+---+
#| id|  x|
#+---+---+
#|  3|  c|
#|  4|  d|
#+---+---+

Начиная с Spark2.4 + мы можем использовать для этого случая функцию exceptAll:

df1.exceptAll(df2).show()

#+---+---+
#| id|  x|
#+---+---+
#|  3|  c|
#|  4|  d|
#+---+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...