Как напечатать ключ и значения отдельно в выводе scala mapValues? - PullRequest
0 голосов
/ 31 января 2019

У меня есть вывод снизу scala code

    val aryDF = Seq((("g3,g4"),Array(("D2,D3,D1"),("D2,D5,D1")))).toDF("v1","v2")
    addresses.toSeq.flatMap(s => s.split(",")).groupBy(identity).mapValues(_.size)

Здесь вывод такой, как показано ниже

    [D2 -> 2, D5 -> 1, D1 -> 2, D3 -> 1]

Однако я пытаюсь распечатать его как ключ и значения в массиве [String, String] формат, подобный приведенному ниже

    val countAddresses = udf((addresses: Seq[String]) => {
    val mp=addresses.toSeq.flatMap(s =>s.split(",")).groupBy(identity).mapValues(_.size)
    mp.keySet.mkString("[", ", ", "]") ++ mp.values.mkString("[", ",", "]")})

    val df2 = aryDF.withColumn("output", countAddresses($"v2"))

1 Ответ

0 голосов
/ 31 января 2019

Вот один из способов генерации столбца ArrayType с объединенной строкой ключа и строкой значения в качестве его элементов:

import org.apache.spark.sql.functions._

val aryDF = Seq(
  ("g3,g4", Array("D2,D3,D1", "D2,D5,D1"))
).toDF("v1", "v2")

val countAddresses = udf( (addresses: Seq[String]) => {
    val mp = addresses.flatMap(_.split(",")).groupBy(identity).mapValues(_.size)
    Array(mp.keys.mkString("[", ", ", "]"), mp.values.mkString("[", ", ", "]"))
  }
)

val df2 = aryDF.withColumn("output", countAddresses($"v2"))

df2.show(false)
// +-----+--------------------+--------------------------------+
// |v1   |v2                  |output                          |
// +-----+--------------------+--------------------------------+
// |g3,g4|[D2,D3,D1, D2,D5,D1]|[[D2, D5, D1, D3], [2, 1, 2, 1]]|
// +-----+--------------------+--------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...