【发布时间】:2017-08-08 07:56:58
【问题描述】:
我必须使用 table2 更新 table1,如果 table2 中不存在 table1 的主键,则将 table2 的整行附加到 table1。如果 table1 的主键存在于 table2 中,则要更新 table1 的所有列,除了table1 的 c3 与 table2 的值。
表 1
c1 c2 c3
... .... ...
k1 a e
k2 b f
k3 c g
k4 d h
表 2
c1 c2 c3
... .... ...
k1 i k
k5 j l
需要的输出
c1 c2 c3
... ... ...
k1 i e
k2 b f
k3 c g
k4 d h
k5 j l
我尝试了以下代码
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}
object Update {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("tabUP").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("f1.csv")
val df2= sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("f2.csv")
df1.registerTempTable("tab1")
df2.registerTempTable("tab2")
val df3=sqlContext.sql("UPDATE tab1,tab2 SET tab1.val2 = tab2.val1,tab1.val3 = tab2.val3 WHERE tab1.val1 = tab2.val1").show()
}
}
由于数据帧是不可变的,我无法对临时表进行更新,有什么方法可以实现它
【问题讨论】:
-
为什么k1的结果有i和e?那不应该是a和e吗?
-
table2 已更新数据,因此 table1 将使用 table2 中的数据进行更新。只有列 c2 将被更新而不是 c3
-
我已经在下面回答了请检查
标签: scala apache-spark dataframe apache-spark-sql