из Spark-2.2 + поддерживает подзапросы, так как вы можете зарегистрировать временное представление и выполнить тот же запрос.
В DataFrameApi для NOT IN
использовать left_anti
присоединиться к mimi c к тому же запросу.
Example:
df.show()
#+----+---+
#|name| id|
#+----+---+
#| a| 1|
#| c| 3|
#+----+---+
df1.show()
#+----+---+
#|name| id|
#+----+---+
#| a| 1|
#| b| 2|
#+----+---+
df.join(df1,'id','left_anti').show()
#+---+----+
#| id|name|
#+---+----+
#| 3| c|
#+---+----+
#only if you have few id values in df2 then
ids=df1.select("id").rdd.map(lambda x:x.id).collect()
#isin accepts only values not columns from another dataframe
df.filter(~col("id").isin(ids)).show()
#+----+---+
#|name| id|
#+----+---+
#| c| 3|
#+----+---+
Если два кадра данных имеют одинаковое количество столбцов, вы можете использовать функцию exceptAll
df.exceptAll(df1).show()
#+----+---+
#|name| id|
#+----+---+
#| c| 3|
#+----+---+
Для in
использование подзапроса left_semi
присоединиться.
df.join(df1,'id','left_semi').show()
#+---+----+
#| id|name|
#+---+----+
#| 1| a|
#+---+----+