鉴于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拆分成可以独立执行的已知大小的块的最有效方法是什么?
答案 0 :(得分:1)
为了提高效率,请不要忘记您可以随时缓存您的RDD。这样可以避免每次调用take
时从文本文件中重新计算已排序的RDD。由于我们将多次使用sorted
RDD,我们将对其进行缓存:
JavaRDD<Integer> sorted = baseRdd.sortBy(x -> x, true, 5).cache();
然后,要将给定索引中的元素转换为另一个索引,我们可以将zipWithIndex
和filter
结合起来。 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