《Spark机器学习进阶实战》——2.4.2 准备数据
2.4.2 准备数据
我们提供的数据格式如下:
用户[user] 签到时间[check-in time] 纬度[latitude] 经度[longitude] 位置标识[location id]
数据样例如下:
0 2010-10-19T23:55:27Z 30.2359091167 -97.7951395833 22847
0 2010-10-18T22:17:43Z 30.2691029532 -97.7493953705 420315
0 2010-10-17T23:42:03Z 30.2557309927 -97.7633857727 316637
0 2010-10-17T19:26:05Z 30.2634181234 -97.7575966669 16516
0 2010-10-16T18:50:42Z 30.2742918584 -97.7405226231 5535878
0 2010-10-12T23:58:03Z 30.261599404 -97.7585805953 15372
0 2010-10-12T22:02:11Z 30.2679095833 -97.7493124167 21714
0 2010-10-12T19:44:40Z 30.2691029532 -97.7493953705 420315
0 2010-10-12T15:57:20Z 30.2811204101 -97.7452111244 153505
0 2010-10-12T15:19:03Z 30.2691029532 -97.7493953705 420315
0 2010-10-12T00:21:28Z 40.6438845363 -73.7828063965 23261
准备数据的步骤如下。
(1)数据清洗
在数据清洗阶段过滤掉不符合规范的数据,并将数据进行格式转换,保证数据的完整性、唯一性、合法性、一致性,并按照CheckIn类填充数据,具体实现方法如下:
// 定义数据类CheckIn
case class CheckIn(user: String, time: String, latitude: Double, longitude: Double, location: String)
// 实例化应用程序入口
val conf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster(mode)
val sc = new SparkContext(conf)
val gowalla = sc.textFile(input).map(_.split("\t")).mapPartitions{
case iter =>
val format = DateTimeFormat.forPattern("yyyy-MM-dd\'T\'HH:mm:ss\'Z\'")
iter.map {
// 填充数据类
case terms => CheckIn(terms(0), terms(1).substring(0, 10), terms(2).toDouble, terms(3).toDouble,terms(4))
}
}
(2)数据转换
在数据转换阶段,将数据转换成向量的形式,供后面数据分析使用。
// 字段:user, checkins, checkin days, locations
val data = gowalla.map{
case check: CheckIn => (check.user, (1L, Set(check.time), Set(check.location)))
}.reduceByKey {
// 并集
case (left, right) =>(left._1 + right._1,left._2.union(right._2),left._3.union(right._3))
}.map {
case (user, (checkins, days:Set[String], locations:Set[String])) =>
Vectors.dense(checkins.toDouble,days.size.toDouble,
locations.size.toDouble)
}
- 点赞
- 收藏
- 关注作者
评论(0)