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

Apache spark 使用Spark和Scala从两个表中提取所需信息,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我必须连接两个表,并在表1中保留col3,如果数据不在表1中,但在表2中,则可以将其视为这样 表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 ,,,, ,,

我必须连接两个表,并在表1中保留col3,如果数据不在表1中,但在表2中,则可以将其视为这样

表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}
导入org.apache.spark.{SparkConf,SparkContext}
对象任务{
def main(参数:数组[字符串]):单位={
val sparkConf=new sparkConf().setAppName(“Myapp”).setMaster(“本地[2]”)
val sc=新的SparkContext(sparkConf)
val sqlContext=新的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.寄存器可清空(“tab1”)
df2.寄存器可清空(“tab2”)
val df3=sqlContext.sql(“从tab1.val1=tab2.val1上的tab1完全外部联接tab2中选择*).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

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

发布您的代码和想要的输出我已经使用了上面的代码,我们有没有办法不重命名列…类似于df1.col1、df1.col2和df2.col1、df2.col2