当前位置: 首页 > 知识库问答 >
问题:

Spark 数据帧需要在像 RDD 这样的过滤器后重新分区?

商华藏
2023-03-14

根据这么多好的资源,建议在过滤操作后重新划分一个RDD。因为,有可能大多数分区现在都是空的。我有一个疑问,在数据帧的情况下,这在当前版本中已经被处理了吗,或者我们仍然需要在过滤操作之后重新划分它吗?

共有3个答案

须志新
2023-03-14

我想这是你的问题。

我应该在重新分区之前还是重新分区之后运行过滤操作?

基于这个假设,过滤器总是试图找到匹配某些条件的记录。因此,合成数据帧/RDD总是小于或等于前一个数据帧/RDD。在大多数情况下,合成集小于前一个。

而重新分区是最昂贵的操作之一,因为它会进行洗牌。永远记住,每当我们执行重新分区时,内存中的数据越少,我们可以从中获得的性能越好。

我甚至不必详细谈论Spark如何处理它等等,在重新分区之前的一般过滤器对性能有好处!

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

博客链接:

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

琴镜
2023-03-14

Spark不会自动重新分区数据。如果需要执行联接和聚合等操作,最好在过滤后对数据进行重新分区。根据您的需要,您应该使用重新分区coalesc。通常,合并是最好的,因为它试图将数据分组在一起而不进行混洗,因此它只会减少分区数。(理解合并和重新划分的良好链接)

如果在过滤操作之后不进行任何繁重计算,性能不会有很大的提高。请记住,重新分区本身也很昂贵。你必须了解你的数据才能做出决定

蒙华翰
2023-03-14

我有一个疑问,在数据帧的情况下,在当前版本中是否已经处理了这一点,或者我们是否仍需要在过滤操作后对其进行重新分区?

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

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

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

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

除非您期望谓词修剪大部分数据或先验分布会使很大一部分分区为空,否则重新分区的成本通常超过潜在的好处,因此调用重新分区的主要原因是限制输出文件的数量。

 类似资料:
  • 来自Spark源代码: https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/Dataset.scala#L2972 可能需要与首先计算 所需的时间一样长。因此,这使得诸如 非常贵。假设< code>DataFrame是< code>DataSet[Row],而< code>

  • 我是scala/sark世界的新手,最近开始了一项任务,它读取一些数据,处理数据并将其保存在S3上。我阅读了一些关于stackoverflow的主题/问题,这些主题/问题涉及重分区/合并性能和最佳分区数(如本例)。假设我有正确的分区数,我的问题是,在将rdd转换为数据帧时,对它进行重新分区是个好主意吗?下面是我的代码目前的样子: 这是我打算做的(过滤后重新分区数据): 我的问题是,这样做是个好主意

  • 我有一个如下的CSV文件。 我想把这个转化成下面。 基本上,我想在输出数据帧中创建一个名为idx的新列,该列将填充与键=idx,value=“n”后面的行相同的值“n”。

  • 我想将数据帧“df1”划分为3列。此数据帧正好有990个针对这3列的唯一组合: 为了优化这个数据帧的处理,我想对df1进行分区,以获得990个分区,每个分区对应一个密钥: 我写了一个简单的方法来计算每个分区中的行数: 我注意到,实际上我得到的是628个带有一个或多个键值的分区,以及362个空分区。 我假设spark会以一种均匀的方式(1个键值=1个分区)重新分区,但这似乎不是这样,我觉得这种重新分

  • 有人能解释一下将为Spark Dataframe创建的分区数量吗。 我知道对于RDD,在创建它时,我们可以提到如下分区的数量。 但是对于创建时的Spark数据帧,看起来我们没有像RDD那样指定分区数量的选项。 我认为唯一的可能性是,在创建数据帧后,我们可以使用重新分区API。 有人能告诉我在创建数据帧时,我们是否可以指定分区的数量。

  • RDD是以数组[数组[字符串]的格式创建的,具有以下值: 我想用模式创建一个数据帧: 接下来的步骤: 给出以下错误: