转换Spark / Scala中的数据类型

问题描述 投票:-2回答:2

我在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]]
arrays scala apache-spark data-structures
2个回答
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
// ))

0
投票

我终于通过以下方式实现了它

val db=a.map{ case Row(word: String) => word }
val model = word2vec.fit( b.map(l=>Seq(l)))
© www.soinside.com 2019 - 2024. All rights reserved.