Spark Dataframe需要在像RDD这样的过滤后重新分区吗?

时间:2018-05-22 19:35:08

标签: apache-spark dataframe pyspark rdd

根据这么多好的资源,建议在过滤器操作后重新分区RDD。因为,大多数分区现在都可能是空的。 我怀疑在数据帧的情况下,这是在当前版本中处理还是我们仍然需要在过滤操作后重新分区?

3 个答案:

答案 0 :(得分:2)

  

我怀疑数据帧是否已在当前版本中处理过,或者我们是否仍需要在过滤操作后对其进行重新分区?

如果你问Spark是否自动重新分配数据,答案是否定的(我希望将来不会改变)

  

根据这么多好的资源,建议在过滤器操作后重新分区RDD。因为,大多数分区现在都可能是空的。

这实际上取决于两个因素:

  • 过滤器的选择性(保留的记录的预期分数是多少)。
  • 在过滤之前,关于谓词的数据分布是什么。

除非您预期谓词修剪大部分数据或先前分布将使相当大一部分分区为空,重新分区的成本通常超过潜在的好处,因此调用Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token at [Source: (String)"{"activities-steps":[ {"dateTime":"2018-04-17","value":"11045"}, {"dateTime":"2018-04-25","value":"8585"}, {"dateTime":"2018-04-26","value":"11218"}, {"dateTime":"2018-04-27","value":"10462"}, {"dateTime":"2018-04"[truncated 762 chars]; line: 1, column: 1] 的主要原因是限制输出的数量文件。

答案 1 :(得分:1)

Spark不会自动重新分区数据。如果您需要执行连接和聚合等操作,最好在过滤后重新分区数据。根据您的需求,您应该使用repartitioncoalesce。通常合并是优选的,因为它试图将数据分组在一起而不进行改组,因此它只减少了分区数。 (good link for understanding coalesce and repartition

如果您在过滤操作后没有进行任何繁重的计算,则不会有巨大的性能提升。请记住,重新分配本身也可能很昂贵。您必须知道您的数据才能做出决定

答案 2 :(得分:0)

我假设这是你的问题。

  

我应该在重新分区之前或重新分区之后运行过滤器操作吗?

基于此假设,过滤器将始终尝试查找与某些条件匹配的记录。因此,结果数据帧/ RDD总是小于或等于先前的数据帧/ RDD。在大多数情况下,结果集小于前一集。

重新分区是最昂贵的操作之一,因为它会进行随机播放。永远记住,无论何时我们进行重新分区,内存中的数据越少,我们的性能就越好。

  

我甚至不必再谈论Spark如何处理它等等   重新分配前的一般过滤器有利于提高性能!

例如,催化剂优化器本身使用过滤器之前和之后来提高性能。

Blog Link:

  

例如,Spark知道如何以及何时进行组合等操作   过滤器,或在连接之前移动过滤器。 Spark 2.0甚至允许你   定义,添加和测试您自己的其他优化规则   运行。 1 [2]