我有2个数据集。一个是大数据集和一个小数据集。我正在处理map map中的数据,方法是将小数据集放在分布式缓存中并将其放入mapper并执行更多操作的连接。 / p>
我希望这可以进入spark java编程。但是我只获得了一个map函数,我可以在哪里转换我的rdd和分布式缓存我要广播rdd,但我没有得到如何将广播变量传递给地图功能。
JavaPairRDD<String, String> logData = sc.wholeTextFiles(args[0]);
logData.map(new Transformation());
String [] vals={"val,hel","hi,by"};
JavaRDD<String>javaRDD=sc.parallelize(Arrays.asList(vals));
Broadcast<String> broadcastVar=sc.broadcast(javaRDD.toString());;
我的地图转换是
public class Transformation implements Function<Tuple2<String, String>, String> {.........}
我想将广播变量传递给地图函数并与其他变换进行连接。
答案 0 :(得分:3)
你所谈论的事情被称为Map-Side Join
。在Spark中,它可以使用广播变量来实现,这是PySpark中的一个简单示例:
cities = {
1 : 'Moscow',
2 : 'London',
3 : 'Paris',
4 : 'Berlin',
5 : 'New York'
}
bcities = sc.broadcast(cities)
data = [
[1, 1.23],
[2, 2.34],
[3, 3.45],
[4, 4.23],
[5, 24.24],
[1, 32.2],
[2, 22.2],
[4, 222.3]
]
sc.parallelize(data).map(lambda x: [bcities.value[x[0]], x[1]]).collect()
如果数据集更大,最好使用Spark Reduce-Side Join
转换来实现join()
对于Java,请参阅the example from Learning Spark - 从第134行开始,您可以在其中找到以下行:
final Broadcast<String[]> signPrefixes = sc.broadcast(loadCallSignTable());
答案 1 :(得分:0)
添加了相同的构造函数并传递了广播变量。 公共转型(广播&gt; val){ }