将数据集应用为Spark中的Broadcast

时间:2017-01-31 11:41:49

标签: java hadoop apache-spark spark-dataframe broadcast

我有两个数据集,我需要在尝试注册时将一个数据集(较小的数据集)注册为广播,以便能够使用广播功能。

以下是代码:

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)。如果将任何手动地图注册为广播,那么它的效果很好,但是在文本文件的情况下,它不起作用。

1 个答案:

答案 0 :(得分:3)

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

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

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

请注意collect()会将整个rdd带到驱动程序,它可能会引发OOM异常。建议广播用于较小尺寸的数据。