在做spark graphx计算时,图的边表初始化,通常需要转化为 srcId,dstId,property 的形式,其中srcId,dstId 需要转化为数字以压缩数据,提高计算效率。即,在分布式spark程序中将字符串转化为正整数的问题。要想实现该功能,有两种方法,首先可以,先收集顶点表,然后逐个设置顶点编号,但是这种方法通常需要线性计算,费时费力。另外一种方法便是运用哈希函数的方式,把对应的字符串转化为特定数字编号,这样就能充分的利用集群的分布式计算能力。
经典的BKDRHash的Scala实现:
def BKDRHash2( str:String) :Int ={
val seed:Int = 131 // 31 131 1313 13131 131313 etc..
var hash:Int = 0
for(i <- 0 to str.length-1){
hash = hash * seed + str.charAt(i)
hash = hash & 0x7FFFFFFF