做大數據開發經常遇上在眾多數據中統計前幾的問題,比如王者榮耀每個區的富豪排行榜(騰訊可以做個刺激消費,😄)
我們在眾多數據中抽取了如下數據:
所在區,用戶名,每次充值數。(a,role1,158)(a,role1,15)(c,role1,18)(b,role3,123)
如上數據可以自行添加多條的hdfs上,不在敘述。
拿到數據首先我們需要分析我們最終要的到的數據的格式,每個區的富豪排行榜,那么首先要把每個人在每個區一共充值多
少錢進行累加,再對各個其進行分區,最終排序。業務很簡單,下面就為大家上干貨
rdd = sc.textFile('/user/hadoop/datas.txt') rdd.take(10) rdd = rdd.map(lambda x:x.split(",")) rdd = rdd.map(lambda x:((x[0],x[1]),int(x[2]))) rdd=rdd.groupByKey() rdd=rdd.map(lambda x:((x[0],sum(list(x[1]))),'')) print(rdd.take(20)) def getPartition(key): s={'a':0,'b':1,'c':2,'d':3} return s.get(key[0][0]) def mysort(key): return key[1] rdd=rdd.repartitionAndSortWithinPartitions(numPartitions=4,partitionFunc=getPartition,ascending=False,keyfunc=mysort) def topN(it): def my(): for i in range(1,6): yield next(it) return my() rdd = rdd.mapPartitions(topN) rdd = rdd.map(lambda x:(x[0])) rdd.collect()
等到如下形式的結果,你就可以面試大數據了,目前也就是這些差不多的工作