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