替换查找表值中的列

Posted

技术标签:

【中文标题】替换查找表值中的列【英文标题】:Replace columns from a lookup table value 【发布时间】:2017-07-04 09:35:32 【问题描述】:

我有两个表,一个带有值,另一个带有查找值。我想用表 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")

现在我需要将“value”重命名为 name 并再次对 age 和其他列执行相同的操作。这是最好的方法吗?

【问题讨论】:

【参考方案1】:

一个简单的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)

【讨论】:

以上是关于替换查找表值中的列的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL 中的列值中提取特定部分(Redshift 平台)

我需要用一些组替换我的 DataFrame 中的列中的值

检查多个列在表值参数中具有多个值中的任何一个

如何在 PySpark 中的 RDD 中的列中查找标准差

我可以使用 MySQL 工作台替换 Mysql 中名为“key”的列中的字符串吗?

从数据框中的列中采样唯一行而不进行替换