如何有效地加入两个表 - 大表和小表?

时间:2015-03-04 06:30:34

标签: hadoop apache-spark

我有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> {.........}

我想将广播变量传递给地图函数并与其他变换进行连接。

2 个答案:

答案 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){     }