Сохранение идентификатора в кроме всех в PySpark - PullRequest
1 голос
/ 16 января 2020

Мне было любопытно, есть ли простой способ сохранить идентификационный идентификатор в команде excALL в PySpark. Например, предположим, что у меня есть два кадра данных (DF1, DF2), оба с столбцом идентификатора и другим столбцом «A». Я хочу сохранить строки в DF1, у которых есть значение для «A», а не в DF2, поэтому, по сути, я пытаюсь сохранить идентификатор с обычным выводом исключенияAll. Я приложил изображение с идеальным выводом.

enter image description here

Ура!

Ответы [ 2 ]

1 голос
/ 16 января 2020

Вы, вероятно, ищете leftanti join в Spark:

df1 = spark.createDataFrame([
  [1, "Dog"],
  [2, "Cat"],
  [3, "Dog"]
], ["id", "A"])

df2 = spark.createDataFrame([
  [4, "Dog"],
  [5, "Elmo"]
], ["id", "A"])

df1.join(df2, ["A"], "leftanti").show()

# +---+---+
# |  A| id|
# +---+---+
# |Cat|  2|
# +---+---+
0 голосов
/ 16 января 2020

метод данных pyspark subtract должен дать вам то, что вы хотите. См. Spark: вычтите два DataFrames для получения более подробной информации.

Использование exceptAll не даст желаемых результатов, так как оно сохранит вторую запись dog в df1, потому что exceptAll сохраняет дубликаты.

С учетом ваших фреймов данных:

df1 = spark.createDataFrame([{'id': 1, 'A': 'dog'},
                             {'id': 2, 'A': 'cat'},
                             {'id': 3, 'A': 'dog'}])

df2 = spark.createDataFrame([{'id': 4, 'A': 'dog'},
                             {'id': 5, 'A': 'elmo'}])

Используйте subtract в интересующем столбце (т. Е. A), затем объедините результаты обратно в исходный фрейм данных, чтобы получить остальные столбцы (т. е. id).

except_df = df1.select('A').subtract(df2.select('A'))

except_df.join(df1, on='A').show()

+---+---+
|  A| id|
+---+---+
|cat|  2|
+---+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...