在Spark / Scala

时间:2017-12-29 16:39:42

标签: arrays scala apache-spark data-structures

我在scala中有一个名为a的变量,如下所示

scala> a
res17: Array[org.apache.spark.sql.Row] = Array([0_42], [big], [baller], [bitch], [shoe] ..)

这是一个包含单个单词的列表数组。

我想将它转换为由字符串序列组成的单个数组,如下所示

Array[Seq[String]] = Array(WrappedArray(0_42,big,baller,shoe,?,since,eluid.........

我试图创建单个包装数组的数组的原因是我想使用MLLIB在spark中运行word2vec模型。

这里的fit()函数只接受可迭代的字符串。

scala> val model = word2vec.fit(b)
<console>:41: error: inferred type arguments [String] do not conform to method fit's type parameter bounds [S <: Iterable[String]]

2 个答案:

答案 0 :(得分:0)

您列出的示例数据不是array of lists,而是array of Rows。您尝试创建的单个WrappedArray数组也似乎没有任何有意义的用途。

如果您想在Array[Row]数据结构中创建包含所有单词字符串的数组,您只需使用map,如下所示:

val df = Seq(
  ("0_42"), ("big"), ("baller"), ("bitch"), ("shoe"), ("?"), ("since"), ("eliud"), ("win")
).toDF("word")

val a = df.rdd.collect
// a: Array[org.apache.spark.sql.Row] = Array(
//   [0_42], [big], [baller], [bitch], [shoe], [?], [since], [eliud], [win]
// )

import org.apache.spark.sql.Row

val b = a.map{ case Row(w: String) => w }
// b: Array[String] = Array(0_42, big, baller, bitch, shoe, ?, since, eliud, win)

[UPDATE]

如果你想创建一个WrappedArray的数组,这里有一种方法:

val b = Array( a.map{ case Row(w: String) => w }.toSeq )
// b: Array[Seq[String]] = Array(WrappedArray(
//   0_42, big, baller, bitch, shoe, ?, since, eliud, win
// ))

答案 1 :(得分:0)

我终于按照以下方式开始工作了

val db=a.map{ case Row(word: String) => word }
val model = word2vec.fit( b.map(l=>Seq(l)))