Как преобразовать этот sql запрос в pyspark? - PullRequest
1 голос
/ 04 мая 2020
SELECT A.* FROM df1 A
WHERE ID NOT IN (SELECT ID FROM df2)

Это код, который я пытаюсь преобразовать

1 Ответ

1 голос
/ 04 мая 2020

из 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|
#+---+----+
...