Как распечатать элементы определенного раздела RDD в Spark?

Как напечатать элементы определенного раздела, скажем, 5-го, в одиночку?

val distData = sc.parallelize(1 to 50, 10)

person Arnav    schedule 06.05.2015    source источник


Ответы (3)


Использование Spark/Scala:

val data = 1 to 50
val distData = sc.parallelize(data,10)
distData.mapPartitionsWithIndex( (index: Int, it: Iterator[Int]) =>it.toList.map(x => if (index ==5) {println(x)}).iterator).collect

производит:

26
27
28
29
30
person Fabio Fantoni    schedule 06.05.2015
comment
Что было бы эквивалентно Python? - person anwartheravian; 11.12.2016
comment
не уверен, почему, но когда я пытаюсь выполнить вышеприведенное в терминале spark-shell, вывод представляет собой просто массив пустых элементов. Любые идеи? - person Saurabh Mishra; 08.02.2017
comment
понятно. последний оператор не должен просто println(x), который ничего не вернет в выходной RDD и, следовательно, ничего не выведет на консоль. Вместо этого вы можете просто x : distData.mapPartitionsWithIndex( (index: Int, it: Iterator[Int]) =›it.toList.map(x =›if (index ==5) {x}).iterator).collect - person Saurabh Mishra; 08.02.2017
comment
Приведенный выше вывод ответа будет произведен именно с этой строкой. Попробуйте это distData.mapPartitionsWithIndex((index: Int, it: Iterator[Int]) =›it.toList.map(x =›if (index ==5) {x} else S).iterator).filter(x= ›x!=S).collect.foreach(x=›print(x+ )) - person Krish; 07.05.2018

Предположим, вы делаете это только для целей тестирования, а затем используете glom(). См. документацию Spark: https://spark.apache.org/docs/1.6.0/api/python/pyspark.html#pyspark.RDD.glom

>>> rdd = sc.parallelize([1, 2, 3, 4], 2)
>>> rdd.glom().collect()
[[1, 2], [3, 4]]
>>> rdd.glom().collect()[1]
[3, 4]

Изменить: пример в Scala:

scala> val distData = sc.parallelize(1 to 50, 10)
scala> distData.glom().collect()(4)
res2: Array[Int] = Array(21, 22, 23, 24, 25)
person Dichen    schedule 24.04.2017

вы можете использовать счетчик API foreachPartition() для достижения этого.

Вот программа на Java, которая печатает содержимое каждого раздела JavaSparkContext context = new JavaSparkContext(conf);

    JavaRDD<Integer> myArray = context.parallelize(Arrays.asList(1,2,3,4,5,6,7,8,9));
    JavaRDD<Integer> partitionedArray = myArray.repartition(2);

    System.out.println("partitioned array size is " + partitionedArray.count());
    partitionedArray.foreachPartition(new VoidFunction<Iterator<Integer>>() {

        public void call(Iterator<Integer> arg0) throws Exception {

            while(arg0.hasNext()) {
                System.out.println(arg0.next());
            }

        }
    });
person urug    schedule 06.05.2015
comment
я уже пробовал 'foreachPartition()', он не напечатал ни одного элемента - person Arnav; 06.05.2015