替换查找表值中的列

时间:2017-07-04 09:35:33

标签: scala apache-spark dataframe apache-spark-sql

我有两个表,一个是值,另一个是查找值。我想用表2中的值替换表1,但是没有找到一种优雅的方法。

表1(主要)

name       age       country       last_visited
 x1        a1          UK            2016
 x2        a3          US            2017
 x3        a1          China         2015

表2(查询)

code      value    date_updated
 x1        Dom       2017
 a1        25        2017
 x2        Peter     2017
 x3        Alice     2017
 a3        26        2017

决赛桌(我想要的)

name       age       country       last_visited
 Dom       25          UK            2016
 Peter     26          US            2017
 Alice     25          China         2015

我已经尝试将表1连接到表2但是后来这涉及我更换/删除列,我必须为每个列单独执行此操作。我只提供了一小部分列,其中我有上面的查找值,但实际上我有大约8列在同一个表中包含查找值。我如何实现这一目标?

 val unsanitised_data = table1.join(table2, table1.col("name") === table2.col("code"), "left").drop("last_visited", "name", "code")

现在我需要重命名"价值"为年龄和其他专栏命名和做同样的事情。这是最好的方法吗?

1 个答案:

答案 0 :(得分:3)

简单的joinselect函数可以解决您的问题

df1.join(df2, df1("name")=== df2("code"), "left").select($"value".as("name"), $"age", $"country", $"last_visited")
  .join(df2,df1("age")=== df2("code"), "left").select($"name", $"value".as("age"), $"country", $"last_visited")
  .show(false)

<强>被修改

如果您有太多columns并且不需要第二张表的列,那么您可以

df1.join(df2, df1("name")=== df2("code"), "left").withColumn("name", col("value")).drop(df2.columns: _*)
  .join(df2,df1("age")=== df2("code"), "left").withColumn("age", col("value")).drop(df2.columns: _*)
  .show(false)