背景
在Kmeans 预处理之前的数据预处理部分,需要做一次类似percent_rank() 操作。
举个例子,输入一条记录为user_1,key1,value_1
输入多条记录
按照key1 聚合之后,结果为key1,list[value1,value2…..]
将list 排序,并获取count 结果为 key1,count,list
然后计算user1 这条记录的rank = index(value1)/count
问题
1 | val ah_freqlist_dic_old = user_ah_freq_dic.map(x=>(x._1._2,Nil:+x._2)) |
上述代码在实现的时候效率极低。
当把这段代码换成 percent_rank() 之后,奇迹发生了1
2
3
4
5
6val df = sqlContext.createDataFrame(user_ah_freq_dic).toDF("user","ah","freq")
df.registerTempTable("uahf")
val sql="select user,ah,percent_rank() over (partition by ah order by freq) as rank from uahf"
val user_ah_percent_dic = sqlContext.sql(sql)
.rdd.map(x=>((x(0).toString,x(1).toString),x(2).toString.toFloat))
果然spark sql 的是做了优化的。阅读spark sql 的源码,又有计划了