为什么PySpark dropDuplicates和Join会给出ODD结果

时间:2018-05-31 13:21:49

标签: python pyspark left-join drop-duplicates

在DropDuplicates和join数据集之后,PySpark给了我一些奇怪的结果。情况是有两个非常大的数据集:一个有人的ID和一些变量,第二个有他们的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 :(得分:0)

pyspark是一个懒惰的翻译。您的代码仅在您调用操作时执行(即show()count()等)。在您的代码示例中,您正在创建file_2file_2实际上只是一组告诉file_2引擎处理步骤的指令,而不是将pyspark视为存在于内存中的对象。当您致电file_2.filter(filter("ID == '1'").show()时,正在执行这些指令(包括dropDuplicates())以生成输出。

当您创建merge_file时,您正在引用file_2的处理步骤,其处理步骤可能与您之前的示例不同。由于dropDuplicates()的延迟执行,无法保证pyspark每次都会丢弃相同的行。这就是您在两个DataFrame之间获得不同结果的原因。

这也是为什么我建议您考虑一下您的数据以及您想要使用merge完成的内容,因为如果dropDuplicates()ID之间的关系region不是一种可靠的方法{1}}很重要。