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

drop_duplicate是否保证在Spark中对dataframe进行排序后保留第一行并删除其余行?

慕河
2023-03-14
frame = frame.orderBy(["b","c"],ascending=False)
frame = frame.drop_duplicate('a')

基于Spark Scala代码,我可以看到Orderby在内部调用sort方法,该方法执行全局排序。

/**
   * Returns a new Dataset sorted by the given expressions. For example:
   * {{{
   *   ds.sort($"col1", $"col2".desc)
   * }}}
   *
   * @group typedrel
   * @since 2.0.0
   */
  @scala.annotation.varargs
  def sort(sortExprs: Column*): Dataset[T] = {
    sortInternal(global = true, sortExprs)
  }

https://github.com/apache/spark/blob/branch-2.4/sql/core/src/main/scala/org/apache/spark/sql/dataset.scala

而且drop_duplicates(cols)方法也按照bellow spark代码转换为聚合(first(cols))。

object ReplaceDeduplicateWithAggregate extends Rule[LogicalPlan] {
  def apply(plan: LogicalPlan): LogicalPlan = plan transformUpWithNewOutput {
    case d @ Deduplicate(keys, child) if !child.isStreaming =>
      val keyExprIds = keys.map(_.exprId)
      val aggCols = child.output.map { attr =>
        if (keyExprIds.contains(attr.exprId)) {
          attr
        } else {
          Alias(new First(attr).toAggregateExpression(), attr.name)()
        }
      }
      // SPARK-22951: Physical aggregate operators distinguishes global aggregation and grouping
      // aggregations by checking the number of grouping keys. The key difference here is that a
      // global aggregation always returns at least one row even if there are no input rows. Here
      // we append a literal when the grouping key list is empty so that the result aggregate
      // operator is properly treated as a grouping aggregation.
      val nonemptyKeys = if (keys.isEmpty) Literal(1) :: Nil else keys
      val newAgg = Aggregate(nonemptyKeys, aggCols, child)
      val attrMapping = d.output.zip(newAgg.output)
      newAgg -> attrMapping
  }
}

有什么想法为什么?

共有1个答案

羊舌子瑜
2023-03-14

没有。

按b&c排序,然后按a删除,如果且仅当只有1个分区要处理,就可以按照您的意愿工作。大数据通常不是这样。

因此,您可以在其他地方谷歌:dropduplicates保留排序操作的第一次出现--只有在有1个分区的情况下,否则就是运气。

 类似资料:
  • 问题内容: 我犯了一个错误,并且有多余的重复项。 我有一个包含4个关键字段的表。,,,。 是自动递增和主键。 的组合,而应该是唯一的,我有我之前创建唯一索引来删除重复的行。有些行有一个重复项,有些行有很多重复项。 向我显示了我需要处理的重复值。但是现在我不知道如何保留一个并删除每个重复集的其余部分。 问题答案: 备份数据,然后… MySQL在DELETE语句中支持JOIN。如果要保留第一个重复项:

  • 删除第一个元素最简单的方法是什么?

  • 我有一个简单的数据库表 我想删除所有按fv和sv分组的重复行。这已经是一个相当流行的问题,有很好的答案。但我需要改变这种情况。当rel\u id为NULL时,我想保留该行。在任何其他情况下,任何事情都会发生。 所以通过使用以下值 任何一个 或 将是有效的结果。其中为 不会。因为第一个条目有作为,它在之上担任主席。 我目前有这个(这是关于基本重复问题的答案)作为删除重复项的查询,但我不确定如何继续修

  • 本文向大家介绍删除一行并在MySQL中使用正确的ID对其他行重新排序?,包括了删除一行并在MySQL中使用正确的ID对其他行重新排序?的使用技巧和注意事项,需要的朋友参考一下 为了理解这个概念,让我们首先创建一个表。创建表的查询如下 使用insert命令在表中插入一些记录。查询如下- 使用select语句显示表中的所有记录。查询如下- 以下是输出 首先从表中删除一行,然后使用update命令对其他

  • 这是一个字段,我给它设置了一些映射,比如哪些键是周日和周一,但在db保存后,我得到了周一和周日的顺序,我需要保持在周日周一的顺序下,我该如何处理?即使保存顺序是好的,就像我想要的,但在数据库中,我看到不同的顺序

  • 问题内容: 我有一个如下所示的数据帧 As shown in my screenshot above, my source datframe () contains few NA’s 当我执行“df2.stack()对于H7和H8,我得到了它对应的日期。 我只想在两个值(,)都为空时删除记录 不。 请注意,我这里只有几列,我的真实数据超过了 150列和列名事先未知。 我希望我的输出如下图所示这是不