- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个大型 csv 文件,已按其中一列进行了预排序。有没有办法利用它们已经排序的事实来更快地获得新的排序 RDD,而无需再次完全排序?
最佳答案
简短的回答:不,在使用 Apache Spark 提供的排序工具时,无法利用两个输入 RDD 已经排序的事实。
长答案:在某些情况下,可能有比使用 sortBy
或 sortByKey
更好的方法。
最明显的情况是输入 RDD 已经排序并表示不同的范围。在这种情况下,假设 rdd1 中的所有元素都位于所有元素之前,则简单地使用 rdd1.union(rdd2) 是组合输入 RDD 的最快(几乎零成本)的方法。 rdd2
中的元素(根据所选顺序)。
当输入 RDD 的范围重叠时,事情会变得更加棘手。假设目标 RDD 只有一个分区,那么在两个 RDD 上使用 toLocalIterator 然后手动进行合并可能会更有效。如果结果必须是 RDD,则可以在自定义 RDD 类型的compute 方法中执行此操作,处理输入 RDD 并生成输出。
当输入很大并因此包含许多分区时,事情会变得更加棘手。在这种情况下,您可能还希望输出 RDD 中有多个分区。您可以使用前面提到的自定义 RDD,但创建多个分区(使用 RangePartitioner
)。每个分区将覆盖不同范围的元素(在最佳情况下,这些范围将覆盖输出中大致相同大小的部分)。
棘手的部分是避免在compute
内多次处理完整的输入RDD。当输入 RDD 使用 RangePartitioner
时,可以使用 OrderedRDDFunctions
中的 filterByRange
有效避免这种情况。当他们不使用RangePartitioner,但您知道分区是内部排序的并且也具有全局顺序时,您首先需要通过实际探测数据来找出这些分区覆盖的有效范围.
由于多分区情况相当复杂,我会检查定制排序是否真的比简单使用 sortBy
或 sortByKey
更快。 sortBy
和 sortByKey
的逻辑在洗牌过程(在节点之间传输数据)方面进行了高度优化。因此,在许多情况下,这些方法很可能比定制逻辑更快,即使定制逻辑可能是 O(n),而 sortBy
/sortByKey
最多可以是 O(n log(n))。
如果您有兴趣了解有关 Apache Spark 使用的改组逻辑的更多信息,可以查看 article解释基本概念。
关于sorting - 如何在spark中合并两个预排序的rdd?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39162275/
我是 Pyspark 新手,我使用的是 Spark 2.0.2。 我有一个名为 Test_RDD 的 RDD,其结构如下: U-Key || V1 || V2 || V3 || ----
我正在寻找一种方法将一个 RDD 拆分为两个或多个 RDD,并将获得的结果保存为两个单独的 RDD。例如: rdd_test = sc.parallelize(range(50), 1) 我的代码:
我有一个结构如下的RDD: ((user_id,item_id,rating)) 让我们将此 RDD 称为训练 然后还有另一个具有相同结构的rdd: ((user_id,item_id,rating)
已经有人问过类似的问题。最相似的是这个: Spark: How to split an RDD[T]` into Seq[RDD[T]] and preserve the ordering 但是,我不
我正在使用 spark 来处理数据。但是我不知道如何将新数据保存到Hive 我从 Hive 加载 rdd,然后运行 map 函数来清理数据。 result = myRdd.map(lambda x
我有一个名为 index 的 rdd:RDD[(String, String)],我想用 index 来处理我的文件。 这是代码: val get = file.map({x => val tmp
我有两个 RDD: **rdd1** id1 val1 id2 val2 **rdd2** id1 v1 id2 v2 id1 v3 id8 v7 id1 v4 id3 v5 id6 v6 我想过滤
我有一个 RDD,需要从另一个 RDD 访问数据。但是,我总是收到任务不可序列化错误。我已经扩展了 Serialized 类,但它没有起作用。代码是: val oldError = rddOfRati
我有一个 RDD,需要从另一个 RDD 访问数据。但是,我总是收到任务不可序列化错误。我已经扩展了 Serialized 类,但它没有起作用。代码是: val oldError = rddOfRati
我有一个 RDD 对: (105,918) (105,757) (502,516) (105,137) (516,816) (350,502) 我想将它分成两个 RDD,这样第一个只有具有非重复值的对
我正在尝试使用 spark 执行 K 最近邻搜索。 我有一个 RDD[Seq[Double]] 并且我打算返回一个 RDD[(Seq[Double],Seq[Seq[Double]])] 带有实际行和
我是Spark和Scala语言的新手,并且希望将所有RDD合并到一个List中,如下所示(List to RDD): val data = for (item {
我找不到只参与 rdd 的方法. take看起来很有希望,但它返回 list而不是 rdd .我当然可以将其转换为 rdd ,但这似乎既浪费又丑陋。 my_rdd = sc.textFile("my
我正在寻找一种将 RDD 拆分为两个或更多 RDD 的方法。我见过的最接近的是 Scala Spark: Split collection into several RDD?这仍然是一个单一的 RDD
我有一个RDD[String],wordRDD。我还有一个从字符串/单词创建 RDD[String] 的函数。我想为 wordRDD 中的每个字符串创建一个新的 RDD。以下是我的尝试: 1) 失败,
我刚刚开始使用 Spark 和 Scala 我有一个包含多个文件的目录我使用 成功加载它们 sc.wholeTextFiles(directory) 现在我想升一级。我实际上有一个目录,其中包含包含文
我想从另一个 RDD 中减去一个 RDD。我查看了文档,发现 subtract可以这样做。实际上,当我测试时 subtract , 最终的 RDD 保持不变,值不会被删除! 有没有其他功能可以做到这一
我在 HDFS 中有如下三个文件中的数据 EmployeeManagers.txt (EmpID,ManagerID) 1,5 2,4 3,4 4,6 5,6 EmployeeNames.txt (E
我正在开发一个应用程序,我需要对 RDD 中具有相同键的每对行执行计算,这是 RDD 结构: List>> dat2 = new ArrayList<>(); dat2.add(new Tuple2>
我在 spark 集群中有两个文件,foo.csv 和 bar.csv,它们都有 4 列和完全相同的字段:时间、用户、url、类别。 我想通过 bar.csv 的某些列过滤掉 foo.csv。最后,我
我是一名优秀的程序员,十分优秀!