调用MLlib库实现Kmeans聚类

MLlib Kmeans Algorithm

使用工具
- IDE:IntelliJ IDEA
- scala解释器:scala-2.12.3
- Java jdk:jdk1.8.0_66
- spark lib:spark-assembly-1.4.1-hadoop2.6.0

Steps

导入Spark MLlib

import org.apache.spark.mllib.clustering.KMeans
import org.apache.spark.mllib.feature.Normalizer
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.{SparkContext}

Vectors和Normailzer都包含在MLlib库中,所以也可以在上面的官网查看用法

代码块

  • 获取SparkContext,读取数据集并转化为RDD
val data = sc.textFile("data/clustering/taxi.txt")

注意:在project目录下新建data目录,并将下载的数据后缀名改为.txt并放在data目录下作为输入文件。

  • 切分数据将其从标称型转化为Double类型,并转化为向量
val parsedData = data.map(s => Vectors.dense(s.split(',').map(_.toDouble)))
  • 数据预处理,将原始数据正则化,并装入缓存
val nor = new Normalizer() //正则化
val nordata = nor.transform(parsedData).cache()
  • 导入Kmeans算法,设置参数并训练模型
val algorithm = new KMeans()
algorithm.setK(6) //类簇个数为6个
algorithm.setMaxIterations(100) //迭代次数为100次
val clusters=algorithm.run(nordata) //训练模型
  • 将类标签和原始数据进行拉链操作,并合并相同项
// 拉链操作
val Kdata = clusters.predict(nordata).zip(parsedData) 
// 合并相同项
val Kdata_res = 
Kdata.map(num =>(num,1)).reduceByKey(_ + _)
  • 将计算结果保存至该工程的outPut目录下,方便查看结果
Kdata_res.saveAsTextFile("outPut/outputOne")
Kdata.saveAsTextFile("outPut/outputTwo")

注意:每次运行时要确保outPut目录不存在,否则程序无法执行

  • 计算各个类簇中心向量,并保存
val Kpoint =sc.parallelize(clusters.clusterCenters)
Kpoint.saveAsTextFile("dataOut/taxi/Kpoint")
提示

在使用IDEA过程中,尤其是编写spark程序时可能会遇到大量问题,既有编译器方面也有代码方面。我遇到过很多编译器方面的问题,下面我就分享一个关于编译器的问题解决方案。

  • Question
17/09/05 21:24:29 ERROR Shell: Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable E:\SoftwareForLinux\local\hadoop\bin\winutils.exe in the Hadoop binaries.
    at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:355)
    at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:370)
    at org.apache.hadoop.util.Shell.<clinit>(Shell.java:363)
    at org.apache.hadoop.util.StringUtils.<clinit>(StringUtils.java:79)
    at org.apache.hadoop.security.Groups.parseStaticMapping(Groups.java:104)
    at org.apache.hadoop.security.Groups.<init>(Groups.java:86)
    at org.apache.hadoop.security.Groups.<init>(Groups.java:66)
    at org.apache.hadoop.security.Groups.getUserToGroupsMappingService(Groups.java:280)
    at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:271)
    at org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:248)
    at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:763)
    at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:748)
    at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:621)
    at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2162)
	at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2162)
    at scala.Option.getOrElse(Option.scala:120)
    at org.apache.spark.util.Utils$.getCurrentUserName(Utils.scala:2162)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:301)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:155)
    at com.roger.taxi.taxiCase$.main(taxiCase.scala:13)
    at com.roger.taxi.taxiCase.main(taxiCase.scala)

通过错误提醒还是勉强能看懂问题出在哪,错误提示缺少hadoop相关组件,尤其是winutils.exe。由于我电脑是32位的,在网上下了很多版本的winutils.exe结果都是64位的与系统不兼容。下面跟大家分享一个32位的hadoop下载地址,由于原始下载链接找不到了就是用百度云盘,提取密码:rmvg。hadoop下载后要添加hadoop的环境变量,这里我不介绍了,可以去网上搜索一下添加环境变量的方法。

最后如果文中有不当之处还请指正修改,感谢阅读本人第一篇博客,大家有疑问也可以通过评论区交流
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值