匹配 Map 中的键时替换列值
Posted
技术标签:
【中文标题】匹配 Map 中的键时替换列值【英文标题】:Replace column values when matching keys in a Map 【发布时间】:2020-01-09 16:11:04 【问题描述】:我有一个数据框,其中包含一个名为 source_system 的列,该列的值包含在此 Map 的键中:
val convertSourceSystem = Map (
"HON_MUREX3FXFI" -> "MX3_FXFI",
"MAD_MUREX3FXFI" -> "MX3_FXFI",
"MEX_MUREX3FXFI" -> "MX3_LT",
"MX3BRASIL" -> "MX3_BR",
"MX3EUROPAEQ_MAD" -> "MX3_EQ",
"MX3EUROPAEQ_POL" -> "MX3_EQ",
"MXEUROPA_MAD" -> "MX2_EU",
"MXEUROPA_PT" -> "MX2_EU",
"MXEUROPA_UK" -> "MX2_EU",
"MXLATAM_CHI" -> "MX2_LT",
"MXLATAM_NEW" -> "MX2_LT",
"MXLATAM_SOV" -> "MX2_LT",
"POR_MUREX3FXFI" -> "MX3_FXFI",
"SHN_MUREX3FXFI" -> "MX3_FXFI",
"UK_MUREX3FXFI" -> "MX3_FXFI",
"SOV_MX3LATAM" -> "MX3_LT"
)
我需要将它们替换为短代码,并且使用 foldLeft 执行 withColumn 只会给我空值,因为它替换了所有值并且最后一个 source_system 不在地图中:
val ssReplacedDf = irisToCreamSourceSystem.foldLeft(tempDf) (acc, filter) =>
acc.withColumn("source_system", when( col("source_system").equalTo(lit(filter._1)),
lit(filter._2)))
【问题讨论】:
【参考方案1】:我会通过加入翻译表来建议另一种解决方案:
// convert Map to a DataFrame
val convertSourceSystemDF = convertSourceSystem.toSeq.toDF("source_system","source_system_short")
tempDf.join(broadcast(convertSourceSystemDF),Seq("source_system"),"left")
// override column with short name, alternatively use withColumnRenamed
.withColumn("source_system",$"source_system_short")
.drop("source_system_short)
【讨论】:
以上是关于匹配 Map 中的键时替换列值的主要内容,如果未能解决你的问题,请参考以下文章