匹配 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 中的键时替换列值的主要内容,如果未能解决你的问题,请参考以下文章

有点意思之你真的了解对象的键值

从列值中查找缺失的键 ID 或数字

使用 Map 替换 Spark 中的列值

更改字典键时出错

MySQL中的正则表达式

Hashmap:当我们放置相同的键时地图如何工作[重复]