gpt4 book ai didi

java - 如何在Spark中将一个RDD拆分成多个?

转载 作者:搜寻专家 更新时间:2023-11-01 02:39:54 26 4
gpt4 key购买 nike

如果我做基本的 groupByKey操作 JavaRdd<Tuple2<String, String>> , 我得到一个 JavaPairRdd<Tuple2<String, Iterable<String>>> :

someStartRdd.groupByKey()

因为每个元组中的可迭代对象的大小将非常大(数百万)并且键的数量也将很大,所以我想像 RDD 一样以流式并行方式处理每个可迭代对象。理想情况下,我希望每个键都有一个 RDD。

目前我唯一能想到的就是收集、创建列表,然后 parallelize :

List<Tuple2<String, Iterable<String>>> r1 = someStartRdd.groupByKey().collect();
for (Tuple2<String, Iterable<String>> tuple : r1){
List<String> listForKey = MagicLibrary.iterableToString(tuple._2());
JavaRdd<String> listRDD = sparkContext.parallelize(listForKey);
...start job on listRDD...
}

但我不想将所有内容都放在内存中来创建列表。更好的解决方案?

最佳答案

如果您有大量的键并且每个键有大量的值,那您就很不走运了。 Spark 最适合长而窄的数据,将 RDD 拆分为多个 RDD 的唯一可靠方法是应用迭代过滤。您会在这里找到原因的解释:How to split a RDD into two or more RDDs?

另一种方法,描述于 Scala Spark: Split collection into several RDD? , 是对数据进行显式分组,但由于它需要非延迟评估,因此不太可能使用大量键。

最后,由于 2GB 的限制、数据倾斜和大型洗牌的总体成本,重新分区可能无法正常工作。

牢记所有这些,可能的策略是尝试以一种利用的方式构建您的算法,除非有必要,否则无需明确移动数据。您可以使用多种方法,包括采样、加盐和不同的近似值。

关于java - 如何在Spark中将一个RDD拆分成多个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36023203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com