Почему PySpark dropDuplicates и Join дает результаты ODD
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 ответ
pyspark
ленивый переводчик Ваш код выполняется только когда вы вызываете действие (т.е. show()
, count()
так далее.). В вашем примере кода вы создаете file_2
, Вместо того, чтобы думать о file_2
как объект, живущий в памяти, file_2
на самом деле просто набор инструкций, который говорит pyspark
двигатель этапов обработки. Когда вы звоните file_2.filter(filter("ID == '1'").show()
эти инструкции выполняются (в том числе dropDuplicates()
) для генерации вывода.
Когда вы создаете merge_file
вы ссылаетесь на этапы обработки для file_2
, что может быть оценено иначе, чем ваш предыдущий пример. Там нет никакой гарантии, что dropDuplicates()
будет отбрасывать одни и те же строки каждый раз из-за ленивого выполнения pyspark
, Вот почему вы получаете разные результаты между двумя DataFrames.
Вот почему я бы посоветовал вам подумать о ваших данных и о том, чего вы хотите достичь merge
так как dropDuplicates()
не является надежным методом, если отношения между ID
а также region
это важно.