1. 程式人生 > >Spark 兩個RDD按key合併(join運算元和cogroup運算元)

Spark 兩個RDD按key合併(join運算元和cogroup運算元)

在工作中經常遇到需要合併RDD的情況,記錄下處理情況。join和cogroup運算元都能達到要求,按key合併,只是當rdd存在多個相同的key時候,最終的輸出結果不一樣。網上找到了處理情況,自己也測試了,程式碼如下:

object Test {
  def main(args: Array[String]): Unit = {

    val spark = SparkSession.builder().appName("test").
      master("local[2]").getOrCreate()

    val sc = spark.sparkContext
    sc.setLogLevel("WARN")

    /**
      * id      name
      * 1       zhangsan
      * 2       lisi
      * 3       wangwu
      */
    val idName = sc.parallelize(Array((1, "zhangsan"), (2, "lisi"), (3, "wangwu")))

    /**
      * id      age
      * 1       30
      * 2       29
      * 4       21
      */
    val idAge = sc.parallelize(Array((1, 30), (2, 29), (4, 21)))

    println("cogroup")

    /**
      * (1,(CompactBuffer(zhangsan),CompactBuffer(30)))
      * (2,(CompactBuffer(lisi),CompactBuffer(29)))
      * (3,(CompactBuffer(wangwu),CompactBuffer()))
      * (4,(CompactBuffer(),CompactBuffer(21)))
      */
    idName.cogroup(idAge).collect().foreach(println)

    println("join")
    // fullOuterJoin於cogroup的結果類似, 只是資料結構不一樣
    /**
      * (1,(Some(zhangsan),Some(30)))
      * (2,(Some(lisi),Some(29)))
      * (3,(Some(wangwu),None))
      * (4,(None,Some(21)))
      */
    idName.fullOuterJoin(idAge).collect().foreach(println)

    /**
      * id      score
      * 1       100
      * 2       90
      * 2       95
      */
    val idScore = sc.parallelize(Array((1, 100), (2, 90), (2, 95)))

    println("cogroup, 出現相同id時")

    /**
      * (1,(CompactBuffer(zhangsan),CompactBuffer(100)))
      * (2,(CompactBuffer(lisi),CompactBuffer(90, 95)))
      * (3,(CompactBuffer(wangwu),CompactBuffer()))
      */
    idName.cogroup(idScore).collect().foreach(println)

    println("join, 出現相同id時")

    /**
      * (1,(Some(zhangsan),Some(100)))
      * (2,(Some(lisi),Some(90)))
      * (2,(Some(lisi),Some(95)))
      * (3,(Some(wangwu),None))
      */
    idName.fullOuterJoin(idScore).collect().foreach(println)
  }


}

相關推薦

Spark RDDkey合併(join運算元cogroup運算元)

在工作中經常遇到需要合併RDD的情況,記錄下處理情況。join和cogroup運算元都能達到要求,按key合併,只是當rdd存在多個相同的key時候,最終的輸出結果不一樣。網上找到了處理情況,自己也測試了,程式碼如下: object Test { def main(ar

LINUX下key合併——join命令

join命令 功能:“將兩個檔案裡指定欄位同樣的行連線起來”,即依照兩個檔案裡共有的某一列,將相應的行拼接成一行。 join [options] file1 file2注:這兩個檔案必須在已經在此列上是依照同樣的規則進行了排序。 join選項 -a FILENUM:除了顯

dateframe物件的合併方法join

兩個dateframe物件的合併方法 如果是以index為時間序列的,那麼可以採用pd的join方法。直接對於索引展開合併專案,使用+法是無法達到目標的。 以下程式碼: import pandas as pd csvfile = file('rb1805_1min.csv', 'rb') r

Spark RDD Key儲存到不同檔案

基本需求 將Keyed RDD[(Key,Value)]按Key儲存到不同檔案。 測試資料 資料格式:id,studentId,language,math,english,classId,depart

python一維列表合併成一個二維列表

>>> list1 = [1,2,3,4,4] >>> list2 = [2,3,4,5,2] >>> z = list(zip(list1,list2)) >>> z [(1, 2), (2, 3), (3, 4)

對象key相同但是value不同,將value不同的鍵值對以對象形式輸出

鍵值對 ons 形式 {} name 但是 ole 相同 key let obj={ name:'jack', age:18, sex:'girl' } let obj2={

java有序連結串列合併

                                       java兩個有序連結串

資料結構中的順序表的合併

#include <iostream> #include<stdlib.h> using namespace std; #define  MAXSIZE 100   #define TRUE 1 #define FALSE 0 #define OK 1

有序數組合併成一個有序陣列,演算法複雜度O(N)

/** * */ /** * @author jueying: * @version 建立時間:2018-10-22 下午01:32:44 * 類說明 */ /** * @author jueying * */ public class Test4 {

陣列的交叉合併

var ary=["A","B","C","D"]; var ary2=[1,2,3,4,5,6,]; function aryJoinAry(ary,ary2) { var itemAry=[]; var minLength; //先拿到兩個陣列中長度較短的那個

有序單鏈表合併成一個有序單鏈表的java實現

僅作為備註, 便於自己回顧. import java.util.Arrays; /** * @author John Kenrinus Lee * @version 2016-10-20 */ public class MergeSort { public static

java實現有序連結串列合併為一個有序連結串列

節點類 public class Node { private Node next; private Integer number; Node(Integer number) { this.number=number; next=null; } Node() {

CAD中如何將CAD圖紙檔案合併

在CAD中,小夥伴們可能會遇到過這樣的問題,那就是在CAD繪圖中怎麼將兩個CAD圖紙檔案進行合併,那在CAD中如何將兩個CAD圖紙檔案的具體操作要怎麼來操作呢?小夥伴們都知道嗎?那下面小編就來教教大傢俱體的操作技巧,希望能夠幫助到你們。 第一步:首先,小夥伴們將電腦進行開啟,如果電腦中沒有安裝CAD編輯器。

C# 將不同的dataTable合併到一個自定義的dataTable中

[csharp]  view plain  copy //比較三種情況        &

java 有序數組合併到一個有序陣列(時間複雜度低)

預設一般會採用陣列先合併,在排序 時間複雜度會在o(n) -o(n*n) 之間 我想了個其他的思路 對陣列1 和陣列2 元素從頭開始進行一次對比,小的放入結果集合, 直到兩個陣列的元素都加入結果集合 這樣的時間複雜度 在o(n) 只要比較兩個陣列較短的長度的次數 程式碼

連結串列的合併

題目要求: 注意題目中的一句話,要求我們使用原來序列中的結點!那麼我們就不能使用新的記憶體單元,來單獨儲存合併後的連結串列。 【如果申請新記憶體,pta會報段錯誤】 使用原來的結點:優點,節省記憶體;缺點,破壞了原來的連結串列,不能原樣輸出原連結串列## 使用新記

leetcode617+二叉樹合併,DP

struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x

比較json,key值相同的情況下判斷另一個json的value值是否為空(遞迴)

前言:作為一個Java的初學者,第一個寫部落格,如有不當之處請多多指教。我是在檢驗報文的必輸項的情況下寫的該方法。 import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONArray

七、有序連結串列合併(遞迴方式)

/** * 合併兩個有序連結串列,合併後依舊有序,當連結串列1是空連結串列時,合併結果就是連結串列2,但連結串列2是空連結串列時, * 合併結果是連結串列1;如果兩都是空連結串列,合併結果就是空連結

C++將遞增連結串列 合併成 一個遞增連結串列 不佔用額外的空間

/*create by tyy*/ #include <iostream> #include <string> using namespace std; #define ok 1 #define error -1 #define overflow -