将字符串的scala Seq转换为键值对
我有一个类似于[1,2]的数组 我已经创建了一个udf,它将执行特定的操作。下面是udf将字符串的scala Seq转换为键值对,scala,apache-spark,Scala,Apache Spark,我有一个类似于[1,2]的数组 我已经创建了一个udf,它将执行特定的操作。下面是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" } 您
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"
}
您可以尝试以下方法 我添加了if条件来处理元素数不相等的情况 这种方法将为您提供可变映射
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)
试试这个
val df=spark.sql
|从值数组“a-1”、“a-2”元素中选择元素
.条纹边缘
df.withColumnp,exprtTransformElements,x->named_struct'id',x',v',In'
.with columnp_json,to_json$p
.showfalse
/**
* +-----+-----------+-----------------------+
*|元素| p | p|u 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))
谢谢大家的回复。到目前为止,您尝试了什么?我实际上是在尝试命名结构,还尝试使用case语句,但似乎没有任何效果,它应该与我提供的UDF一起工作。它与我提供的UDF不同。我实际上在别人建议后使用了你的第二种方法,但我需要使它与我更改的UDF一起工作,但我并没有改变需求。我只是添加了一个新的输出值。需求仍然是我使用spark 2.3时遇到的问题。这与我今天早上向你们提出的相同问题有关。我必须创建一个UDF不能使用spark 2.4。我创建了UDF def addOneelements来代替转换:Seq[String]=elements.mapelement=>id,CIS-$element,CISKey,Ind,但现在仍坚持转换为键值对