我在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]]
您列出的样本数据不是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
// ))
我终于通过以下方式实现了它
val db=a.map{ case Row(word: String) => word }
val model = word2vec.fit( b.map(l=>Seq(l)))