繁体   English   中英

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

[英]How to join two tables — big and small ones — effectively?

我有2个数据集。一个是大数据集和一个小数据集。我通过将小数据集放在分布式缓存中并将其放入映射器并执行更多操作的连接来处理map中的数据。

我希望这可以进入spark java编程。但是我只获得了一个map函数,我可以在哪里转换我的rdd和分布式缓存我要广播rdd,但我没有得到如何将广播变量传递给map函数。

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

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

您正在谈论的事情称为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 join()转换实现Reduce-Side Join

对于Java,请参阅Learning Spark中的示例 - 从第134行开始,您可以在其中找到该行:

final Broadcast<String[]> signPrefixes = sc.broadcast(loadCallSignTable());

添加了相同的构造函数并传递了广播变量。 公共转型(广播> val){}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM