【问题标题】:Replace column values when matching keys in a Map匹配 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)))
    }

【问题讨论】:

    标签: scala apache-spark


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多