我有一个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());
试试这个-
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 |
* +-----+
*/