Spark ML - 聚类算法
1.KMeans快速聚类
首先到UR需要的包:
import org.apache.spark.ml.clustering.{KMeans,KMeansModel}
import org.apache.spark.ml.linalg.Vectors
开启RDD
的隐式转换:
import spark.implicits._
为了便于生成相应的DataFrame
,这里定义一个名为model_instance
的case class
作为DataFrame
每一行(一个数据样本)的数据类型。
case class model_instance (features: org.apache.spark.ml.linalg.Vector)
在定义数据类型完成后,即可将数据读入RDD[model_instance]
的结构中,并通过RDD
的隐式转换.toDF()
方法完成RDD
到DataFrame
的转换:
val rawData = sc.textFile("file:///home/hduser/iris.data")
val df = rawData.map(
line =>
{ model_instance( Vectors.dense(line.split(",").filter(p => p.matches("\\d*(\\.?)\\d*"))
.map(_.toDouble)) )}).toDF()
与MLlib版的教程类似,我们使用了filter算子,过滤掉类标签,正则表达式\\d*(\\.?)\\d*
可以用于匹配实数类型的数字,\\d*
使用了*
限定符,表示匹配0次或多次的数字字符,\\.?
使用了?
限定符,表示匹配0次或1次的小数点。
在得到数据后,我们即可通过ML包的固有流程:创建Estimator
并调用其fit()
方法来生成相应的Transformer
对象,很显然,在这里KMeans
类是Estimator
,而用于保存训练后模型的KMeansModel
类则属于Transformer
:
val kmeansmodel = new KMeans().
setK(3).
setFeaturesCol("features"<