如何将Seq [Column]转换为Map [String,String]并更改值?

时间:2018-08-06 01:25:21

标签: scala apache-spark data-structures apache-spark-sql

我是Scala和Spark的新手,我正努力做到以下几点, 我试图将Seq转换为Map,同时在转换序列时通过添加“ _suffix”来修改值,如下所示:

val columns = Seq($"col2",$"col3")
val map = columns.map(t => t.toString() -> t.toString()+"_suffix").toMap

但是,出现以下错误:

scala> val map = columns.map(t => t.toString() -> t.toString()+"_suffix").toMap
<console>:25: error: Cannot prove that String <:< (T, U).
       val map = columns.map(t => t.toString() -> t.toString()+"_suffix").toMap

此外,.map结果返回以下内容:

scala> val map = columns.map(t => t.toString() -> t.toString()+"_suffix")
map: Seq[String] = List((col2,col2)_suffix, (col3,col3)_suffix)

这就是我想要产生的:

map: Seq[(String, String)] = List((col2,col2_suffix), (col3,col3_suffix)

所以我最终可以将其转换为地图:

map: scala.collection.immutable.Map[String,String] = Map(col2 -> col2_suffix, col3 -> col3_suffix)

我很难达到这个目标,有什么建议吗?

2 个答案:

答案 0 :(得分:2)

这是您应该输入的内容($将在有问题的引号之前被删除):

scala> val columns = Seq("col2","col3")
columns: Seq[String] = List(col2, col3)

在您的代码中,无需使用toString()方法 在每个字符串上,因为它们已经是strings, 并使用如下地图:

val map = columns.map(t => (t,t+"_suffix")).toMap

在Scala REPL中:

scala> val map = columns.map(t => (t,t+"_suffix"))
map: Seq[(String, String)] = List((col2,col2_suffix), (col3,col3_suffix))

scala> val map = columns.map(t => (t,t+"_suffix")).toMap
map: scala.collection.immutable.Map[String,String] = Map(col2 -> col2_suffix, col3 -> col3_suffix)

答案 1 :(得分:2)

您所做的是正确的,只需添加一些括号即可使用:

columns.map(t => t.toString() -> (t.toString() + "_suffix")).toMap

从结果中可以看到,"_suffix"被添加到元组的字符串中,即

(col2,col2)_suffix

您想要做的是仅将字符串添加到第二个元素,因此必须加上括号。