Объедините 2 столбца карты в искру sql - PullRequest
0 голосов
/ 30 мая 2020

Здравствуйте, я использую объединение udf из кирпичного дома для объединения в карты для приведенного ниже примера.

выберите объединить (map ('a', 1, 'b', 0), map ('a', 0, 'c', 1))

Если объединяет карты, но я хочу сохранить максимальное значение при объединении карт. возможно ли?

1 Ответ

0 голосов
/ 30 мая 2020

Вы можете использовать udf для объединения map to get the key having max value, как показано ниже -

       val mapConcat = udf((map1: Map[String, Int], map2: Map[String, Int]) => {

      val finalMap = mutable.Map.empty[String, mutable.ArrayBuffer[Int]]
      map1.foreach { case (key: String, value: Int) =>
        if (finalMap.contains(key))
          finalMap(key) :+ key
        else finalMap.put(key, mutable.ArrayBuffer(value))
      }
      map2.foreach { case (key: String, value: Int) =>
        if (finalMap.contains(key))
          finalMap(key) :+ key
        else finalMap.put(key, mutable.ArrayBuffer(value))
      }
      finalMap.mapValues(_.max)
    })
    spark.udf.register("my_map_concat", mapConcat)
    spark.range(2).selectExpr("map('a',1,'b',0)","map('a',0,'c',1)",
      "my_map_concat(map('a',1,'b',0),map('a',0,'c',1))")
      .show(false)

Output-

+----------------+----------------+-------------------------------------+
|map(a, 1, b, 0) |map(a, 0, c, 1) |UDF(map(a, 1, b, 0), map(a, 0, c, 1))|
+----------------+----------------+-------------------------------------+
|[a -> 1, b -> 0]|[a -> 0, c -> 1]|[b -> 0, a -> 1, c -> 1]             |
|[a -> 1, b -> 0]|[a -> 0, c -> 1]|[b -> 0, a -> 1, c -> 1]             |
+----------------+----------------+-------------------------------------+

...