我知道有几个问题已经提出了类似的主题,但我无法对我的问题应用任何答案,也想知道最佳实践。将数据集从SQL转换为RDD [矢量]
我已经将ML的日期集加载到SQL数据库。我想根据它应用mllib的聚类功能。我已经使用sqlContext
将SQL数据库加载到DataFrame
,删除了不相关的列。然后发生问题的部分,我通过解析DataFrame的每一行来创建一个向量。 然后使用toJavaRDD
函数将矢量转换为RDD。
下面是代码(作品):
val usersDF = sqlContext.read.format("jdbc").option("url","jdbc:mysql://localhost/database").
option("driver","com.mysql.jdbc.Driver").option("dbtable","table").
option("user","woot").option("password","woot-password").load()
val cleanDF = usersDF.drop("id").drop("username")
cleanDF.show()
val parsedData = cleanDF.map(s => Vectors.dense(s.toString().replaceAll("[\\[\\]]", "").trim.split(',').map(_.toDouble))).cache()
val splits = parsedData.randomSplit(Array(0.6,0.4), seed = 11L)
val train_set = splits(0).cache()
val gmm = new GaussianMixture().setK(2).run(train_set)
我的主要问题问候我的火花文档阅读:Local vector,在我的理解数据帧映射将在工人执行,以后会在创建Vector时发送给驱动程序(是否是本地向量的含义)才能稍后再次发送给工人?有没有更好的方法来实现这一目标?
另一件事是,将SQL加载到DataFrame中仅将其转换为字符串并再次解析它似乎有点奇怪。有没有其他的最佳实践建议?