1.背景描述:
日志中用户ID一般都是非整数的字符串,在使用Spark ALS做推荐时,ALS的train函数的第一个参数是Rating。而Rating的第一个参数userID是Int型,故要使用Rating来做训练数据集,就要将用户ID字符串映射成Int型。
2.解决思路:
Spark的RDD自带方法zipWithUniqueId可以将RDD中元素和一个唯一ID组合成键/值对。
3.原理阐释:
每个分区中第一个元素的唯一ID值为:该分区索引号,每个分区中第N个元素的唯一ID值为:(前一个元素的唯一ID值) + (该RDD总的分区数)。
4.应用实例:
scala> var rdd = sc.makeRDD(Seq("A","B","C","D","E","F"),2)
rdd1: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[44] at makeRDD at :21
scala> rdd.zipWithUniqueId().collect
res32: Array[(String, Long)] = Array((A,0), (B,2), (C,4), (D,1), (E,3), (F,5))
//总分区数为2
//第一个分区第一个元素ID为0,第二个分区第一个元素ID为1
//第一个分区第二个元素ID为0+2=2,第一个分区第三个元素ID为2+2=4
//第二个分区第二个元素ID为1+2=3,第二个分区第三个元素ID为3+2=5
将Array的第二个Long参数用toInt函数转换为Int,再用toMap函数将rdd转换为Map[String,Int]即可。由于key和value都是唯一的,故可构建一个反转的Map,value当做key,key当做value。这个Map是为了将userID还原成原字符串。