代码之家  ›  专栏  ›  技术社区  ›  Fincher

Spark dataframe-替换Scala中键/值列表中的所有值

  •  0
  • Fincher  · 技术社区  · 8 年前

    val replacements = Map( "STREET" -> "ST", "STR" -> "ST")
    

    我正在将一个表读入一个数据帧,我想修改一个列,用它们的值替换映射中键的所有实例。因此,在上面的地图中,查看“street”列,将“street”的所有值替换为“ST”,将“STR”的所有值替换为“ST”等。

    我一直在研究foldLeft的一些实现,但还没能成功。

    val CleanIt: Column = trim(regexp_replace(regexp_replace(regexp_replace(colName," OF "," ")," AT "," ")," AND "," "))
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Tzach Zohar    8 年前

    您可以创建这个helper方法,将给定的列和替换映射转换为新的 Column 表达式:

    def withReplacements(column: Column, replacements: Map[String, String]): Column = 
      replacements.foldLeft[Column](column) {
        case (col, (from, to)) => regexp_replace(col, from, to)
      }
    

    然后用在你的脸上 street 列与您的 replacements 地图:

    val result = df.withColumn("street", withReplacements($"street", replacements))
    

    例如:

    df.show()
    // +------------+------+
    // |      street|number|
    // +------------+------+
    // | Main STREET|     1|
    // |Broadway STR|     2|
    // |     1st Ave|     3|
    // +------------+------+
    
    result.show()
    // +-----------+------+
    // |     street|number|
    // +-----------+------+
    // |    Main ST|     1|
    // |Broadway ST|     2|
    // |    1st Ave|     3|
    // +-----------+------+
    

    注意 "St." 具有 "ST" ,您应该使用 Map("St\\." -> "ST) (转义为dot,否则将被解释为regex的“any”)