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

如何使用RDDAPI在分区内排序(并避免跨分区排序)?

岳允晨
2023-03-14

Hadoop MapReduce的默认行为是在分区内对schffle键进行排序,但不是跨分区(它是使键跨部分排序的总排序)

我想问如何使用Spark RDD实现同样的事情(分区内排序,但不跨分区排序)

    < li>RDD的< code>sortByKey方法是进行总排序 < li>RDD的< code > repartitionandsorttwithinpartitions 在分区内进行排序,而不是跨分区,但不幸的是,它增加了一个额外的步骤来进行重新分区。

有没有一种直接的方法可以在分区内而不是跨分区进行排序?

共有2个答案

杜俊逸
2023-03-14

我以前从未有过这种需求,但我的第一个猜测是使用任何*Partition*方法(例如foreachPartition )在每个分区内进行排序。

因为它们给了你一个Scala 迭代器,你可以使用< code>it.toSeq然后应用Seq的任何排序方法,例如< code>sortBy或< code>sortWith或< code>sorted。

钱凌
2023-03-14

您可以使用< code>Dataset和< code > sort within partitions 方法:

import spark.implicits._

sc.parallelize(Seq("e", "d", "f", "b", "c", "a"), 2)
  .toDF("text")
  .sortWithinPartitions($"text")
  .show

+----+
|text|
+----+
|   d|
|   e|
|   f|
|   a|
|   b|
|   c|
+----+

一般来说,混洗是对分区进行排序的一个重要因素,因为它重用混洗结构来进行排序,而无需一次将所有数据加载到内存中。

 类似资料:
  • 我正在学习快速排序在第四算法课程,罗伯特塞奇威克。 我想知道quicksort代码的以下分区是长度为n的数组中比较的个数。

  • 但我想知道如何选择我希望的支点,例如在这个整数列表中,8、7、1、9、11、5、6,我希望选择键6作为我代码中的支点。或者我想选9或者其他什么。我怎样才能把它写进我的代码?非常感谢任何帮助。

  • 我有一个带有分区键(UUID)的DynamoDB表,其中有几个属性(如名称、电子邮件、创建日期等)。创建日期是项目中的一个属性,其格式为YYYY-MM-DD。但现在有一个要求更改-我必须根据创建日期对其进行排序,并提供整个数据(也就是说,我不能只将数据放在某个特定分区上,而是以排序方式将所有分区中的所有数据都放在一起。我知道这可能需要DynamoDB花费时间从所有分区中提取数据并在之后进行排序。我

  • 问题内容: 在我的系统中,我有客户。客户有程序。我想显示一个客户端列表,显示其最近的活动(如果存在)程序。 因此,我们有这样的事情: 表示该程序未关闭。因此,它将首先放置未关闭的程序,然后再放置最近关闭的程序。 问题是,排序依据在组内不起作用。它只是随机选择一个程序。我该如何解决? 只是想出了这个: 这似乎给出正确的结果。这是正确的,还是我很幸运?即,我基本上已经在对表进行排序之前对其进行了排序;

  • 问题链接1链接2链接3 从上面的链接,我希望我遵循的答案是被接受的。但我还是有例外。我正在使用Java 6。 代码: 堆栈跟踪:

  • 我在<code>java.text.RuleBasedCollator中遇到线程阻塞问题。getCollationKey()当我的服务器负载过重时。 下面是出现问题的类: 下面是来自线程转储的一个片段,显示了有问题的阻塞: " xxxhttp 227 " prio = 5 tid = 0x 355 NID = 0x 163 BLOCKED归hybrishttp 109 Id = 236-stats