在spark中应用数据集作为广播

o2rvlv0m  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(420)

我有两个数据集,我需要注册一个数据集(较小的一个)作为广播时,试图注册我可以使用广播功能。
代码如下:

JavaRDD<String> maps = ctx.textFile("C:\\Users\\sateesh\\Desktop\\country.txt");
Broadcast<JavaRDD<String>> broadcastVar = ctx.broadcast(maps);
//Broadcast<Map<Integer, String>> broadcastVar = ctx.broadcast(map);
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(9);
JavaRDD<Integer> listrdd = ctx.parallelize(list);
JavaRDD<Object> mapr = listrdd.map(x -> broadcastVar.value());
System.out.println(mapr.collect());

在这里我无法得到 broadcastVar.value().get(x) . 如果我将任何手动Map注册为广播,它可以正常工作,但如果是文本文件,它就不能工作。

nkhmeac6

nkhmeac61#

为了将任何数据广播到集群,它必须来自驱动程序。所以, collect() 你的 rdd 然后广播。

JavaRDD<String> rdd = ctx.textFile("C:\\Users\\sateesh\\Desktop\\country.txt");

Broadcast<List<String>> broadcastVar = ctx.broadcast(rdd.collect());

请注意 collect() 将带来整个 rdd 对于驱动程序,它可能引发oom异常。对于较小的数据建议广播。

相关问题