Apache spark foreach中的批处理或spark中的foreach分区

Apache spark foreach中的批处理或spark中的foreach分区,apache-spark,spark-dataframe,Apache Spark,Spark Dataframe,我们正在读取一个包含大量行的文件。读取之后,我们需要对foreach行进行缓存调用。缓存支持批处理最多获取30条记录。所以,如何在foreach/foreach分区内对数据进行分组,以便一次选择30个元素进行缓存调用。scala中有一些grouped()函数可用。我正在java中寻找类似的东西 一种方法是执行迭代器.partition()。尝试了解是否有任何方法可以使用标准方法。我建议不要使用缓存!一次30条记录不可扩展。 如果可能的话,我建议将缓存加载到数据帧中并缓存此数据帧。 i、 e Da

我们正在读取一个包含大量行的文件。读取之后,我们需要对foreach行进行缓存调用。缓存支持批处理最多获取30条记录。所以,如何在foreach/foreach分区内对数据进行分组,以便一次选择30个元素进行缓存调用。scala中有一些grouped()函数可用。我正在java中寻找类似的东西


一种方法是执行迭代器.partition()。尝试了解是否有任何方法可以使用标准方法。

我建议不要使用缓存!一次30条记录不可扩展。 如果可能的话,我建议将缓存加载到数据帧中并缓存此数据帧。 i、 e

Dataframe cached=CreateDataframeFromCache(我的缓存).cache()

然后使用缓存的数据帧按键加入

如果缓存非常小,我还建议您阅读广播变量:

您可以通过一个键对条目进行分组,该键强制将30个条目分组,然后在这些组的RDD上为每个条目运行

例如:

JavaPairRDD<Integer, Long> numbers = 
         sc.parallelize(Arrays.asList(0,1,2,3,4,5, ..., 99))
           .zipWithIndex();
            //Adding an index as your data may not necessarily be ints

按时间触发流式处理批处理,不确定是否可以按记录进行批处理这是一个批处理作业而不是流式处理作业。好的,那么我将删除标记
long count = numbers.count();
long remDiv = count/30; //long division

JavaPairRDD<Long, Iterable<Integer>> groupsOf30 = numbers
            .mapToPair(number -> new Tuple2<>(number._2 % remDiv, number._1 ))
            .groupByKey();
groupsOf30.foreach(tuple -> {
    //Here, you should be able to process the iterable in one go...
    tuple._2 is an iterable of about 30 records
});