提问者:小点点

如何在JavaSpark中重新分区后找出每个分区中的项目


我有一个JavaArrayList,只有很少的整数值。我用ArrayList创建了一个数据集。我使用了System. out.println(DF.javaRDD().getNumGroutions());它导致了1个分区。我想把数据分成3个分区。所以我使用了重新分区()。我想在重新分区后找出每个分区中的项目数。

在scala它是直截了当的。

DF.repartition(3).mapPartitions((it) => Iterator(it.length));

但是相同的语法在Java不起作用,因为长度函数在Java的迭代器接口中不可用。

我们应该如何解释映射分配函数?

mapPartitions(FlatMapFunction<java.util.Iterator<T>,U> f)

内部函数将采用的参数是什么,它的返回类型是什么?

SparkSession sessn = SparkSession.builder().appName("RDD to DF").master("local").getOrCreate();
        List<Integer> lst = Arrays.asList(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
        Dataset<Integer> DF = sessn.createDataset(lst, Encoders.INT());
        System.out.println(DF.javaRDD().getNumPartitions()); 

共1个答案

匿名用户

试试这个-

   List<Integer> lst = Arrays.asList(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
        Dataset<Integer> DF = spark.createDataset(lst, Encoders.INT());
        System.out.println(DF.javaRDD().getNumPartitions());
        MapPartitionsFunction<Integer, Integer> f =
                it -> ImmutableList.of(JavaConverters.asScalaIteratorConverter(it).asScala().length()).iterator();
        DF.repartition(3).mapPartitions(f,
                Encoders.INT()).show(false);
        /**
         * 2
         * +-----+
         * |value|
         * +-----+
         * |6    |
         * |8    |
         * |6    |
         * +-----+
         */