Преобразование scala Seq строки в пару значений ключа - PullRequest
0 голосов
/ 17 июня 2020

У меня есть массив вроде [1,2]

Я создал udf, который будет выполнять определенную c операцию. Ниже находится UDF

def addOne(elements: Seq[String]) = elements.map(element => ("id",s"a-$element","v","In"))

, поэтому вывод похоже на [["id","a-1","v","In"],["id","a-2","v","In"]]

Я хочу преобразовать его в пары ключ-значение

Окончательный o / p должен быть примерно таким

{

id:"a-1",

v:"In"

},
{

id:"a-2",

v:"In"

}

Ответы [ 3 ]

1 голос
/ 17 июня 2020

Вы можете попробовать следующий подход

Я добавил, если условие для обработки, если количество элементов не является четным Этот подход даст вам изменяемую карту

val seq = Seq(1,"a",2,"b")

val itr = seq.iterator

val newMap: scala.collection.mutable.Map[Any,Any] = scala.collection.mutable.Map()

if(seq.size % 2 == 0) 

while(itr.hasNext) {

 newMap += (itr.next->itr.next)

}

println(newMap)

Другой вариант для получения результата на неизменяемой карте

 val seq = Seq(1,"a",2,"b")


def listToMap[T](xs: Seq[T]) =
  xs.grouped(2)
    .map{case List(a, b) => (a,b)}
    .toMap


val newMap = listToMap(seq)

println(newMap)
0 голосов
/ 17 июня 2020

Мне удалось его решить

def addOne(elements: Seq[String]) = elements.map(element => (List("id",s"a-$element","v","Ind").grouped(2).collect { case List(k, v) => k -> v }.toMap))

Спасибо всем за ваш ответ.

0 голосов
/ 17 июня 2020

Попробуйте это

  val df = spark.sql(
      """
        |select elements from values (array('a-1', 'a-2')) T(elements)
      """.stripMargin)
    df.withColumn("p", expr("TRANSFORM(elements, x -> named_struct('id', x, 'v', 'In'))"))
      .withColumn("p_json", to_json($"p"))
      .show(false)

    /**
      * +----------+----------------------+---------------------------------------------+
      * |elements  |p                     |p_json                                       |
      * +----------+----------------------+---------------------------------------------+
      * |[a-1, a-2]|[[a-1, In], [a-2, In]]|[{"id":"a-1","v":"In"},{"id":"a-2","v":"In"}]|
      * +----------+----------------------+---------------------------------------------+
      */
...