1. 程式人生 > >SparkSql中join的實現( inner join,left outer join,right outer join,full outer join)

SparkSql中join的實現( inner join,left outer join,right outer join,full outer join)

Join是SQL語句中的常用操作,良好的表結構能夠將資料分散在不同的表中,使其符合某種正規化,減少表冗餘、更新容錯等。而建立表和表之間關係的最佳方式就是Join操作。

SparkSQL作為大資料領域的SQL實現,自然也對Join操作做了不少優化,今天主要看一下在SparkSQL中的Join,inner join,left outer join,right outer join,full outer join。

1.innerjoin:

程式碼實現:

  1. // 啟動spark-shell,定義兩個rdd,做join操作

  2. [[email protected] ~]$ spark-shell --master local[2]

  3. scala> val a = sc.parallelize(Array(("A","a1"),("B","b1"),("C","c1"),("D","d1"),("E","e1"),("F","f1")))

  4. a: org.apache.spark.rdd.RDD[(String, String)] = ParallelCollectionRDD[0] at parallelize at <console>:24

  5. scala> val b = sc.parallelize(Array(("A","a2"),("B","b2"),("C","c1"),("C","c2"),("C","c3"),("E","e2")))

  6. b: org.apache.spark.rdd.RDD[(String, String)] = ParallelCollectionRDD[1] at parallelize at <console>:24

  7. scala> a.join(b).collect    // 這裡的join是inner join,只返回左右都匹配上的內容

  8. res1: Array[(String, (String, String))] = Array((B,(b1,b2)), (A,(a1,a2)), (C,(c1,c1)), (C,(c1,c2)), (C,(c1,c3)), (E,(e1,e2)))

  9. scala> b.join(a).collect    

  10. res2: Array[(String, (String, String))] = Array((B,(b2,b1)), (A,(a2,a1)), (C,(c1,c1)), (C,(c2,c1)), (C,(c3,c1)), (E,(e2,e1)))

  11. scala>

2.left outer join:

程式碼實現:

  1. scala> a.leftOuterJoin(b).collect

  2. res3: Array[(String, (String, Option[String]))] = Array((B,(b1,Some(b2))), (F,(f1,None)), (D,(d1,None)), (A,(a1,Some(a2))), (C,(c1,Some(c1))), (C,(c1,Some(c2))), (C,(c1,Some(c3))), (E,(e1,Some(e2))))

  3. scala> b.leftOuterJoin(a).collect

  4. res5: Array[(String, (String, Option[String]))] = Array((B,(b2,Some(b1))), (A,(a2,Some(a1))), (C,(c1,Some(c1))), (C,(c2,Some(c1))), (C,(c3,Some(c1))), (E,(e2,Some(e1))))

  5. scala>

3.right outer join:

程式碼實現

  1. scala> a.rightOuterJoin(b).collect

  2. res4: Array[(String, (Option[String], String))] = Array((B,(Some(b1),b2)), (A,(Some(a1),a2)), (C,(Some(c1),c1)), (C,(Some(c1),c2)), (C,(Some(c1),c3)), (E,(Some(e1),e2)))

  3. scala> b.rightOuterJoin(a).collect

  4. res6: Array[(String, (Option[String], String))] = Array((B,(Some(b2),b1)), (F,(None,f1)), (D,(None,d1)), (A,(Some(a2),a1)), (C,(Some(c1),c1)), (C,(Some(c2),c1)), (C,(Some(c3),c1)), (E,(Some(e2),e1)))

  5. scala>

4.full outer join:

程式碼實現:

  1. scala> val a = sc.parallelize(Array(("A","a1"),("B","b1"),("C","c1"),("D","d1"),("E","e1"),("F","f1")))

  2. a: org.apache.spark.rdd.RDD[(String, String)] = ParallelCollectionRDD[49] at parallelize at <console>:24

  3. scala> val b = sc.parallelize(Array(("A","a2"),("B","b2"),("C","c1"),("C","c2"),("C","c3"),("E","e2")))

  4. b: org.apache.spark.rdd.RDD[(String, String)] = ParallelCollectionRDD[50] at parallelize at <console>:24

  5. scala> a.fullOuterJoin(b).collect

  6. res15: Array[(String, (Option[String], Option[String]))] = Array((B,(Some(b1),Some(b2))), (F,(Some(f1),None)), (D,(Some(d1),None)), (A,(Some(a1),Some(a2))), (C,(Some(c1),Some(c1))), (C,(Some(c1),Some(c2))), (C,(Some(c1),Some(c3))), (E,(Some(e1),Some(e2))))

  7. scala> b.fullOuterJoin(a).collect

  8. res16: Array[(String, (Option[String], Option[String]))] = Array((B,(Some(b2),Some(b1))), (F,(None,Some(f1))), (D,(None,Some(d1))), (A,(Some(a2),Some(a1))), (C,(Some(c1),Some(c1))), (C,(Some(c2),Some(c1))), (C,(Some(c3),Some(c1))), (E,(Some(e2),Some(e1))))

  9. scala>

相關推薦

SparkSqljoin實現 inner joinleft outer joinright outer joinfull outer join

Join是SQL語句中的常用操作,良好的表結構能夠將資料分散在不同的表中,使其符合某種正規化,減少表冗餘、更新容錯等。而建立表和表之間關係的最佳方式就是Join操作。 SparkSQL作為大資料領域的SQL實現,自然也對Join操作做了不少優化,今天主要看一下在SparkS

JS陣列實現倒序遍歷陣列陣列連線字串

// =================== 求最大值===================================== <script> var arr = [10,35,765,21345,678,89]; va

原始碼編譯OpenJdk 8Netbeans除錯Java原子類在JVM實現Ubuntu 16.04

一、前言 前一陣子比較好奇,想看到底層(虛擬機器、彙編)怎麼實現的java 併發那塊。 volatile是在彙編里加了lock字首,因為volatile可以通過檢視JIT編譯器的彙編程式碼來看。 但是原子類,本來在jvm中就是彙編實現的,反而沒法看。如果能實際跟蹤一下斷點,應該也算實際驗證了。 &

常用布局的實現兩列布局、三列適應布局兩列等高適應布局等

html 絕對定位 頁面優化 cnblogs ... con bold strong ack 兩列布局:左側定寬,右側自適應方法一:利用float和負外邊距 <style> * { margin: 0; padding: 0; } .main,.si

MVVM模式解析和在WPF實現

開發 特點 還需 如果 情況下 依次 顯示 尋找 這也 MVVM模式簡介 MVVM是Model、View、ViewModel的簡寫,這種模式的引入就是使用ViewModel來降低View和Model的耦合,說是降低View和Model的耦合。也可以說是是降低界面和邏輯的耦合

SpringBoot在Kotlin實現

文件中 open 代碼 rabl delete ons list any data 根據現在的開發模式和網上的一些資料,SpringBoot需要對業務和操作進行分層,通常分為controller、entity、service、respository等結構。下面以Kotlin

快速和改進的二維凸包演算法及其在On log h實現實現部分

此篇接上一篇部落格http://blog.csdn.net/firstchange/article/details/78588669 實施選擇 陣列與列表 “List”類是一個C#集合,它使用一個數組作為其底層容器。使用“列表”而不是陣列應該有類似的效能。測試證實,

快速和改進的二維凸包演算法及其在On log h實現理論部分

在國外某知名網站上瀏覽資訊時發現了一篇非常好的論文,因為是英文的,自己翻譯、整理了一下,如果想看原始的可以去以下連結:https://www.codeproject.com/Articles/1210225/Fast-and-improved-D-Convex-Hull-algorithm-

MyBatis分頁功能的實現陣列分頁、sql分頁、攔截器RowBounds分頁

前言:學習hibernate & mybatis等持久層框架的時候,不外乎對資料庫的增刪改查操作。而使用最多的當是資料庫的查詢操

upsert在mysql實現附spark應用

upsert概述以及在mysql中的實現   upsert是update和insert的合體,這裡暫時不對其具體的語義進行探討,簡單對其做一個定義,基本功能為:存在時更新,不存在時插入,簡單的解釋就是,當某種條件成立時使用update,條件不成立時使用ins

OpenCV 學習之 將圖片插入另一張圖片實現ROI

/** * 將一張圖片插入另一種圖片中 */ static void exam2() { Mat image = Imgcodecs.imr

java 非阻塞演算法在併發容器實現ConcurrentLinkedQueue原始碼

簡介 非阻塞演算法在更細粒度的層面協調爭用,它比傳統的鎖有更高的併發性。隨著非阻塞演算法在 Java 中的應用越來越廣泛,java.concurrent 包中用非阻塞演算法實現的併發容器也越來越多,ConcurrentLinkedQueue 就是其中的一個重要

經典加密演算法在VB實現1- Base64

Public key(1 To 3) As Long Private Const base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst uvwxyz0123456789+/" Public Sub GenKey()

三種快速排序演算法的實現遞迴演算法、非遞迴演算法、三路劃分快速排序

快速排序的三個步驟: 1、分解:將陣列A[l...r]劃分成兩個(可能空)子陣列A[l...p-1]和A[p+1...r],使得A[l...p-1]中的每個元素都小於等於A(p),而且,小於等於A[p

SparkSQL的三種Join及其實現broadcast join、shuffle hash join和sort merge join

1.小表對大表(broadcast join) 將小表的資料分發到每個節點上,供大表使用。executor儲存小表的全部資料,一定程度上犧牲了空間,換取shuffle操作大量的耗時,這在SparkSQL中稱作Broadcast Join Broadcast Jo

oracle各種連線left join,right join,inner join用法

left join:左連線,返回左表中所有的記錄以及右表中連線欄位相等的記錄。 right join :右連線,返回右表中所有的記錄以及左表中連線欄位相等的記錄。 inner join :內連線,又叫等值連線,只返回兩個表中連線欄位相等的行。 full join:外連

SQL各種Join語句leftrightfullinner的區別

iamlaosong文 實際工作中常常需要將多個表的查詢結果合成的一個查詢中,我一般採用join語句進行連線,用的最多的就是left join,這麼多join的差別是什麼呢?簡單的說就是最終結果以誰為

Linq連線兩個List列表 例項詳解Linq inner joinleft join

本章節主要介紹Linq的聯接運算,對兩個List< T >,分別 inner join 和 left join 聯接,以此為例,進行例項詳解,程式碼也是自己編寫,親測通過的,可以直接拿著當demo使用。 聯接是指將一個數據源物件與另一個數據源

mysql高效查詢left join 和 group by前提是加了索引

mysql犧牲了group by來增加left join的速度(前提是加了索引)。 user表:10萬資料 例項1: 200秒左右 SELECT U.id, A.favorite_count FR

mysql查詢left join求並集where求交集

mysql語法準備(兩張表t1,t2):表t1:mysql> select * from t1;+-------+---------+| t1_id | t1_name |+-------+---------+| 1 | t1_1 || 2 | t1_2 |+-------+