web-dev-qa-db-ja.com

Sparkで特定のRDDパーティションの要素を印刷するにはどうすればよいですか?

特定のパーティションの要素、たとえば5番目だけを印刷するにはどうすればよいですか?

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

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
9
Fabio Fantoni

foreachPartition()APIに対するカウンターを使用してそれを実現することができます。

これがJava各パーティションのコンテンツを出力するプログラムです。JavaSparkContextcontext= 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());
            }

        }
    });
2
urug

テスト目的でこれを行うと仮定して、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)
1
Dichen