apache spark - 迭代跳过并从RDD中获取

时间:2018-03-19 17:04:22

标签: java apache-spark rdd

鉴于RDD,对它进行排序然后以离散大小的块消费它的最佳方法是什么?例如:

  JavaRDD<Integer> baseRdd = sc.parallelize(Arrays.asList(1,2,5,3,4));

  JavaRDD<Integer> sorted = baseRdd.sortBy(x -> x, true, 5);   

  // returns 1, 2   
  List<Integer> first = sorted.take(2);

  // returns 1, 2.  How to skip 2 and then take?
  List<Integer> second = sorted.take(2);

我真正想要的是在第一次调用1, 2时使用take(2),然后进行某种&#34;跳过&#34;传递到第二个take(2)以返回3, 4的参数?

因为那&#34;跳过&#34;函数似乎不存在于当前的RDD功能中,将排序的RDD拆分成可以独立执行的已知大小的块的最有效方法是什么?

2 个答案:

答案 0 :(得分:1)

为了提高效率,请不要忘记您可以随时缓存您的RDD。这样可以避免每次调用take时从文本文件中重新计算已排序的RDD。由于我们将多次使用sorted RDD,我们将对其进行缓存:

JavaRDD<Integer> sorted = baseRdd.sortBy(x -> x, true, 5).cache();

然后,要将给定索引中的元素转换为另一个索引,我们可以将zipWithIndexfilter结合起来。 zipWithIndex将RDD转换为元组的RDD,其中元组的第一部分是已排序的RDD的元素,第二部分是其索引。一旦我们有了这些索引记录,我们就可以通过它们的索引来过滤它们(比如说offset = 2和window = 2):

List<Integer> nth =
  sorted.zipWithIndex()
  .filter(x -> x._2() >= offset && x._2() < offset + window)
  .map(x -> x._1())
  .collect();

返回:

[3, 4]

最终结果将是:

JavaRDD<Integer> sorted = baseRdd.sortBy(x -> x, true, 5).zipWithIndex().cache();

Integer offset = 2;
Integer window = 2;

List<Integer> nth =
  sorted
  .filter(x -> x._2() >= offset && x._2() < offset + window)
  .map(x -> x._1())
  .collect();

这里我只是在用索引压缩它之后缓存了rdd,以便每次我们在不同的窗口上执行此操作时都不执行压缩部分。

然后,您可以将此nth创建代码段映射到循环或地图中,具体取决于您希望如何创建不同的窗口列表。

答案 1 :(得分:0)

rdd1=sc.parallelize((1,2,3,4,5,6,7,8))
rdd2=rdd1.take(2)

现在您根据rdd2过滤您的初始rdd

rdd1.filter(lambda line:line not in rdd2).take(2)

这给出了[3,4]

使用PySpark