Spark DataFrame中的join型別

2021-07-15 03:07:57 字數 3734 閱讀 2829

spark dataframe中join與sql很像,都有inner join, left join, right join, full join;

那麼join方法如何實現不同的join型別呢?

看其原型

def join(right : dataframe, usingcolumns : seq[string], jointype : string) : dataframe

def join(right : dataframe, joinexprs : column, jointype : string) : dataframe

可見,可以通過傳入string型別的jointype來實現。

jointype可以是」inner」、「left」、「right」、「full」分別對應inner join, left join, right join, full join,預設值是」inner」,代表內連線

persondataframe.join(orderdataframe, persondataframe("id_person") === orderdataframe("id_person")).show()

persondataframe.join(orderdataframe, persondataframe("id_person") === orderdataframe("id_person"), "inner").show()

結果如下:

id_person

name

address

id_order

ordernum

id_person1張三

深圳353311張三

深圳444412李四

成都132523王五

廈門2343

「left」,」left_outer」或者」leftouter」代表左連線

persondataframe.join(orderdataframe, persondataframe("id_person") === orderdataframe("id_person"), "left").show()

persondataframe.join(orderdataframe, persondataframe("id_person") === orderdataframe("id_person"), "left_outer").show()

結果如下:

id_person

name

address

id_order

ordernum

id_person1張三

深圳353311張三

深圳444412李四

成都132523王五

廈門2343

4朱六杭州null

null

null

「right」,」right_outer」及「rightouter」代表右連線

persondataframe.join(orderdataframe, persondataframe("id_person") === orderdataframe("id_person"), "right").show()

persondataframe.join(orderdataframe, persondataframe("id_person") === orderdataframe("id_person"), "right_outer").show()

結果如下:

id_person

name

address

id_order

ordernum

id_person2李四

成都132523王五

廈門2343

1張三深圳3

53311張三

深圳44441

null

null

null

577711

「full」,」outer」,」full_outer」,」fullouter」代表全連線

persondataframe.join(orderdataframe, persondataframe("id_person") === orderdataframe("id_person"), "full").show()

persondataframe.join(orderdataframe, persondataframe("id_person") === orderdataframe("id_person"), "full_outer").show()

persondataframe.join(orderdataframe, persondataframe("id_person") === orderdataframe("id_person"), "outer").show()

結果如下:

id_person

name

address

id_order

ordernum

id_person1張三

深圳353311張三

深圳444412李四

成都132523王五

廈門2343

4朱六杭州null

null

null

null

null

null

577711

scala測試原始碼:

import org.apache.spark.

import org.apache.spark.sql.sqlcontext

case

class

persons

(id_person: int, name: string, address: string)

case

class

orders

(id_order: int, ordernum: int, id_person: int)

object

dataframetest

}

如何實現的呢?檢視spark原始碼中sql部分可知其是將string型別轉換為了jointype

jointype的伴生物件中對string型別的typ先轉換成小寫,然後去掉typ中的下劃線_,之後用模式匹配來決定用的是哪種join型別,另外,從原始碼中可知,除了內連線、左連線、右連線、全連線外,還有個leftsemi連線,這種連線沒用過,不太清楚

spark中jointype原始碼:

object

jointype

}sealed

abstract

class

jointype

case

object

inner

extends

jointype

case

object

leftouter

extends

jointype

case

object

rightouter

extends

jointype

case

object

fullouter

extends

jointype

case

object

leftsemi

extends

jointype

Spark DataFrame中的join使用說明

spark dataframe中join與sql很像,都有inner join,left join,right join,full join 型別說明 inner join 內連線left join 左連線right join 右連線full join 全連線def join right dataf...

spark dataframe筆記(鏈結彙總)

spark dataframe筆記 dataframe行轉列 spark dataframe筆記 對dataframe一列值保留4位小數 spark dataframe筆記 按照dataframe某一列的數值排序,並增加一列索引 2 降序排 spark dataframe筆記 按照dataframe...

Spark DataFrame關於資料常用操作

sql語法 1.檢視全表資料 dataframe.show 2.檢視部分字段資料 有4種方法 1 dataframe.select 欄位名稱 show 2 dataframe.select 欄位名稱 show 推薦 3 dataframe.select col 欄位名稱 show 4 datafra...