【问题标题】:udate a csv file using the other csv file in spark使用 spark 中的另一个 csv 文件更新一个 csv 文件
【发布时间】: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


【解决方案1】:

您可以使用outer join 具有c1 列的表并将table2 的值复制到table1,如下所示。 重命名 table2 的 c2c3 列,因为它们与 table1 的名称相同。

val tempTable2 = table2.select('c1, 'c2.as("c22"), 'c3.as("c23"))

import org.apache.spark.sql.functions._
table1.join(tempTable2, Seq("c1"), "outer")
    .withColumn("c2", when('c22.isNotNull, 'c22).otherwise('c2))
    .withColumn("c3", when('c3.isNull, 'c23).otherwise('c3))
    .drop("c22", "c23")

你的输出应该是

+---+---+---+
|c1 |c2 |c3 |
+---+---+---+
|k2 |b  |f  |
|k4 |d  |h  |
|k5 |j  |l  |
|k1 |i  |e  |
|k3 |c  |g  |
+---+---+---+

【讨论】:

    猜你喜欢
    • 2020-05-05
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 2021-07-08
    相关资源
    最近更新 更多