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

在dataframe spark/scala中更新映射列

  •  1
  • Nick01  · 技术社区  · 7 年前

    我有一个dataframe origMap,其中一列是map类型的。我想在地图上添加更多条目

    我正在做以下工作:

    val origMap = df("mapping")
    
    val tempMap = tempDFFields.flatMap(tempField => Array(lit(tempField), tempDF(tempField))): _*)
    
    origMap.withColumn("mapping", tempMap.union(origMap))
    

    TempdFields是tempDF中的列名列表。

    我正在创建所有colname的地图->从tempDF获取colvalue,并希望将其添加到原始DF。 它抱怨我传递的是列的数组,而不是列的单个实例。如何在此处传递列的单个实例。。我只想更新地图并存储回去。

    例子:

    输入

    origDF

    +--------+-----------------------------
    |id  | amount       | mapping         | 
    |1   | 10           | {a=b, c=d}      |
    |3   | 90           | {e=f, g=h}           |
    

    坦普德夫

    +-----
    |Id |
    |1  |
    

    输出:origDF

    +--------+-----------------------------
    |id  | amount       | mapping          | 
    |1   | 10           | {a=b, c=d, id=1} |
    |3   | 90           | {e=f, g=h, id=1} |
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   koiralo    7 年前

    你可以创建一个 udf 如下图所示合并地图

    val origDF = Seq(
      (1, 10, Map("a" -> "b", "c" -> "d")),
      (3, 90, Map("e" -> "f", "g" -> "h"))
    ).toDF("id", "amount", "mapping")
    
    If you have a single row DF you can create a map directly
    val tmpDF = Map("id" -> "1")
    
    //UDf to merge the two map 
    val addToMap = udf((mapping: Map[String, String]) => {mapping ++ tmpDF})
    
    //Use the udf 
    origDF.withColumn("mapping", addToMap($"mapping"))
    
    .show(false)
    

    输出:

    +---+------+----------------------------+
    |id |amount|mapping                     |
    +---+------+----------------------------+
    |1  |10    |Map(a -> b, c -> d, id -> 1)|
    |3  |90    |Map(e -> f, g -> h, id -> 1)|
    +---+------+----------------------------+
    

    希望这有帮助!