繁体   English   中英

将字符串的 scala Seq 转换为键值对

[英]Convert a scala Seq of string to key value pair

我有一个像 [1,2] 这样的数组

我创建了一个将执行特定操作的 udf。下面是 UDF

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

所以输出p就像[["id","a-1","v","In"],["id","a-2","v","In"]]

我想把它转换成键值对

最终的 o/p 应该类似于

{

id:"a-1",

v:"In"

},
{

id:"a-2",

v:"In"

}

您可以尝试以下方法

如果元素数量不均匀,我已经添加了 if 条件来处理这种方法会给你可变的 map

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)

在不可变 Map 中获得结果的其他选项

 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)

尝试这个

  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"}]|
      * +----------+----------------------+---------------------------------------------+
      */

我能够解决它

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))

谢谢大家的回复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM