2017-08-07 24 views
-4

我必須連接兩個表並將col3保留在table1中,並且如果table1中不存在數據但存在於table2中,則可以這樣做。使用spark和scala從兩個表中提取所需的信息

表1

col1 col2 col3 

,,,, ,,,, ,,,, 
a  p  d 
b  q  e 
c  r  f 
d  s  g 

表2

col1 col2 col3 

,,,, ,,,, ,,,, 
a  m  s 
e  q  l 

所需輸出

col1 col2 col3 
,,,, ,,,, ,,,, 
a  m  d 
b  q  e 
c  r  f 
d  s  g 
e  q  l 

我嘗試下面的代碼

import org.apache.spark.sql.{Row, SQLContext} 
import org.apache.spark.{SparkConf, SparkContext} 

object Tasktr { 
    def main(args: Array[String]): Unit = { 
    val sparkConf = new SparkConf().setAppName("Myapp").setMaster("local[2]") 
    val sc = new SparkContext(sparkConf) 
    val sqlContext = new SQLContext(sc) 

    val df1 = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("/home/magnetto/Desktop/ip.csv") 
    val df2= sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("/home/magnetto/Desktop/del.csv") 
    df1.registerTempTable("tab1") 
    df2.registerTempTable("tab2") 
    val df3=sqlContext.sql("select * from tab1 FULL OUTER JOIN tab2 ON tab1.val1=tab2.val1").show() 

我得到了下面的輸出

val1|val2|val3|val1|val2|val3| 
+----+----+----+----+----+----+ 
| k1| l1| a|null|null|null| 
| k2| l2| b|null|null|null| 
| k3| l3| c|null|null|null| 
| k4| l4| d| k4| l4| e| 
|null|null|null| k5| l9| f| 
+----+----+----+----+----+----+ 

我已經試過全外連接的兩個表,但無法獲得所需要的輸出。

+0

發佈您的代碼,並輸出想要 – Travis

+0

我用上面的代碼 –

回答

0

鑑於dataframes作爲

table1的

+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
|a |p |d | 
|b |q |e | 
|c |r |f | 
|d |s |g | 
+----+----+----+ 

表2

+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
|a |m |s | 
|e |q |l | 
+----+----+----+ 

你可以實現你通過執行以下操作渴望的結果。更名是爲了避免衝突,而之後將功能join

val tempTable2 = table2.select('col1, 'col2.as("col22"), 'col3.as("col23")) 

import org.apache.spark.sql.functions._ 
table1.join(tempTable2, Seq("col1"), "outer") 
    .withColumn("col2", when('col22.isNotNull, 'col22).otherwise('col2)) 
    .withColumn("col3", when('col3.isNull, 'col23).otherwise('col3)) 
    .drop("col22", "col23") 

,這將給你造成的

+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
|e |q |l | 
|d |s |g | 
|c |r |f | 
|b |q |e | 
|a |m |d | 
+----+----+----+ 
+0

有什麼辦法我們可以不重命名列...像df1.col1,df1.col2和df2.col1,df2.col2 –