使用Spark和Scala从两个表中提取所需信息

时间:2017-08-07 18:33:57

标签: apache-spark apache-spark-sql

我必须连接两个表并在table1中保持col3,如果table1中没有数据但是在table2中存在,则可以将其作为原样。

表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|
+----+----+----+----+----+----+

我已尝试在两个表上进行完全外连接,但无法获得理想的输出。

1 个答案:

答案 0 :(得分:0)

将数据帧设为

表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   |
+----+----+----+

通过执行以下操作,您可以获得所需的结果。重命名是为了避免在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   |
+----+----+----+