[英]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.