我们读取包含大量行的文件。阅读后,我们需要为foreach行进行缓存调用。缓存支持批处理最多可获得30条记录。因此,如何在foreach / foreach分区中对数据进行分组,一次挑选30个元素以进行缓存调用。 scala中有一些groups()函数可用。我正在寻找类似java的东西。
一种方法是做Iterators.partition()。试图了解是否有任何方式标准的做法。
答案 0 :(得分:0)
我建议不要使用你的缓存!一次30条记录不可扩展。 我建议将缓存加载到数据帧中并尽可能缓存此数据帧。 即
Dataframe cached = CreateDataframeFromCache(my_cache).cache()
然后使用缓存的数据框通过您的密钥加入。
如果您的缓存非常小,我还建议您阅读有关广播变量的信息: https://spark.apache.org/docs/latest/rdd-programming-guide.html#broadcast-variables
答案 1 :(得分:0)
您可以通过强制30个条目组的键对条目进行分组,然后在这些组的RDD上运行for-each。
举个例子:
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
现在创建一个键,将RDD分成30个组(大致):
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();
上述对RDD基本上允许您使用RDD.foreach
方法处理30个组:
groupsOf30.foreach(tuple -> {
//Here, you should be able to process the iterable in one go...
tuple._2 is an iterable of about 30 records
});