Почему PySpark dropDuplicates и Join дает результаты ODD - PullRequest
0 голосов
/ 31 мая 2018

PySpark дает мне небольшие странные результаты после dropDuplicates и объединения наборов данных.Ситуация такова, что есть два очень больших набора данных: один с идентификатором людей и некоторыми переменными, а второй с их region_code

первый набор данных:

ID|VAR1|VAR2|VAR3|VAR4|VAR5|
1|-----|----|---|---|----|
2|-----|----|---|---|----|
3|-----|----|---|---|----|
4|-----|----|---|---|----|

второй набор данных:

ID|region_code|
1|7|
2|5|
1|9|
4|7|

результат, который я получаю после следующего кода:

file_1 = file_1.dropDuplicates(["ID"])
file_2 = file_2.dropDuplicate(["ID"])
file_2.filter(filter("ID == '1'").show()

ID|region_code|
1|7|

После объединения файлов я ожидаю:

merge_file = file_1.join(file_2, "ID", "left")

ID|VAR1|VAR2|VAR3|VAR4|VAR5|region_code|
1|-----|----|---|---|----|7|
2|-----|----|---|---|----|5|
3|-----|----|---|---|----|null|
4|-----|----|---|---|----|7|

но я получил:

merge_file.filter("ID == '1'").show()

ID|VAR1|VAR2|VAR3|VAR4|VAR5|region_code|
1|-----|----|---|---|----|9|

Мне очень любопытны эти странные результаты.

1 Ответ

0 голосов
/ 31 мая 2018

pyspark - ленивый переводчик.Ваш код выполняется только при вызове действия (например, show(), count() и т. Д.).В вашем примере кода вы создаете file_2.Вместо того, чтобы думать о file_2 как о объекте, живущем в памяти, file_2 на самом деле является просто набором инструкций, которые сообщают движку pyspark об этапах обработки.Когда вы вызываете file_2.filter(filter("ID == '1'").show(), эти инструкции выполняются (включая dropDuplicates()) для генерации вывода.

Когда вы создаете merge_file, вы ссылаетесь на шаги обработки для file_2, которые можно оценитьиначе, чем ваш предыдущий пример.Нет гарантии, что dropDuplicates() будет отбрасывать одни и те же строки каждый раз из-за отложенного выполнения pyspark.Вот почему вы получаете разные результаты между двумя фреймами данных.

Именно поэтому я бы посоветовал вам подумать о ваших данных и о том, чего вы хотите достичь с помощью merge, поскольку dropDuplicates() не является надежнымметод, если важна связь между ID и region.

...