2016-05-30 31 views
0

我正在用scala编写的spark项目中的MySQL数据库中读取一个表。这是我的第一周,所以我真的不适合。当我试图运行Scala Spark类型错配找到单元,需要rdd.RDD

val clusters = KMeans.train(parsedData, numClusters, numIterations) 

我得到了parsedData一个错误,指出:“类型不匹配;发现:org.apache.spark.rdd.RDD [地图[字符串,任何]要求:组织。 apache.spark.rdd.RDD [org.apache.spark.mllib.linalg.Vector]”

我的解析的数据被上面创建这样的:

val parsedData = dataframe_mysql.map(_.getValuesMap[Any](List("name", "event","execution","info"))).collect().foreach(println) 

其中dataframe_mysql是无论是从sqlcontext.read.format("jdbc").option(....) function.返回

我该如何将我的单位转换为符合要求才能通过火车功能?

根据文件,我应该使用这样的事情:

data.map(s => Vectors.dense(s.split(' ').map(_.toDouble))).cache() 

我应该改变我的价值观翻番?因为当我尝试运行上面的命令时,我的项目会崩溃。

谢谢!

回答

1

删除尾部.collect().foreach(println)。拨打collect之后,您不再拥有RDD - 它只会变成本地收藏。

随后,当您拨打foreach时,它会返回Unit - foreach用于执行诸如打印集合中每个元素的副作用。等等。

+0

是的!我这样做,但它不匹配没有它: 类型不匹配;找到:org.apache.spark.rdd.RDD [Map [String,Any]] required:org.apache.spark.rdd.RDD [org.apache.spark.mllib.linalg.Vector] – Kratos

+0

对于KMeans,您需要把你的所有功能变成双打,并创建一个矢量。 MLLib指南中的示例按“”分割,因为输入由空格分隔,并且它们是使用map(_。toDouble)转换的数值。 –

相关问题