Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字符串的scala Seq转换为键值对_Scala_Apache Spark - Fatal编程技术网

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

将字符串的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" } 您

我有一个类似于[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"

}

您可以尝试以下方法

我添加了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,但现在仍坚持转换为键值对