替换查找表值中的列
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】:一个简单的join
和select
函数应该可以解决您的问题
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 平台)