簡體   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