Spark小練習 求各科老師最受歡迎的TopN

2021-08-29 07:59:27 字數 3085 閱讀 9640

spark小練習——求各科老師最受歡迎的topn

資料格式

1.資料切分

val func=(line:string)=>
2.邏輯計算

2.1求所有科目中最受歡迎的老師topn

//拿到資料來源

val lines=sc.textfile(path)

val teacherandone=lines.map(func)

val reduced=teacherandone.reducebykey(_+_)

val sorted=reduced.sortby(_._2,false)

val result=sorted.top(topn))

2.2求各科最受歡迎老師的topn

(1)使用scala中的sortby方法(適用於資料量較小的情況)

val lines=sc.textfile(path)

val subjectandteacher=lines.map(func)

val maped=subjectandteacher.map((_,1))

val reduced=maped.reducebykey(_+_)

//按學科分組,得到的key是學科,value是學科對應的老師資料的迭代器

val grouped: rdd[(string, iterable[((string, string), int)])]=reduced.groupby(_._1._1)

//將每乙個組拿出來進行操作

//為什麼可以呼叫scala的sortby方法

//因為乙個學科的資料已經在一台機器上的乙個集合裡了(缺點:在記憶體中序,

//如果資料量大的話,可能會出問題)

val sorted=grouped.mapvalues(_.tolist.sortby(_._2).reverse.take(topn))

//資料量較小,所以就直接收集了,也可以把它儲存到檔案中

val result=sorted.collect()

(2)使用rdd中的sortby方法(適用於資料量較大的情況)

val lines=sc.textfile(path)

val subjectandteacher=lines.map(func)

val subjects=subjectandteacher.keys.distinct()

val maped=subjectandteacher.map((_,1))

val reduced=maped.reducebykey(_+_)

for(sb <- subjects)

(3)自定義分割槽器,以學科來分割槽

i.分割槽器subjectpartitioner

class subjectpartitioner(subjects:array[string]) extends partitioner

//返回分割槽的數量(下乙個rdd有多少分割槽)

override def numpartitions:int =subjects.length

//根據傳入的key計算分割槽標號

override def getpartition(key: any):int =

}

ii.邏輯

val lines=sc.textfile(path)

val subjectandteacher=lines.map(func)

val subjects=subjectandteacher.keys.distinct()

val maped=subjectandteacher.map((_,1))

//聚合

//第一次shuffle

val reduced=maped.reducebykey(_+_)

//自定義分割槽器,按照指定的分割槽器來進行分割槽

//partitionby按照指定的分割槽規則來分割槽

//第二次shuffle

val partitioned: rdd[((string, string), int)] =reduce.partitionby(new subjectpartitioner(subjects))

//一次操作乙個分割槽

//將迭代器轉換成list然後排序再轉換成迭代器返回

it.tolist.sortby(_._2).reverse.take(topn).iterator

//缺點:又是載入到記憶體再排序

})

(4)減少shuffle次數

val lines=sc.textfile(path)

val subjectandteacher=lines.map(func)

val subjects=subjectandteacher.keys.distinct()

val maped=subjectandteacher.map((_,1))

//分割槽器

val sbpartitioner=new subjectpartitioner(subjects)

//聚合

//第一次shuffle

val reduced=maped.reducebykey(sbpartitioner,_+_)

//一次操作乙個分割槽

//將迭代器轉換成list然後排序再轉換成迭代器返回

it.tolist.sortby(_._2).reverse.take(topn).iterator

//缺點:又是載入到記憶體再排序

//優化:即排序,又不全部載入到記憶體

//考慮用乙個定長treeset來裝從迭代器中取出的資料,然後排序留下topn,後面的再裝入新的資料,再排序,重複操作直到迭代完該學科的所有資料

})

python小練習 利用filter求素數

計算素數的乙個方法是埃氏篩法,它的演算法理解起來非常簡單 首先,列出從2開始的所有自然數,構造乙個序列 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,取序列的第乙個數2,它一定是素數,然後用2把序列的2的倍數篩掉 3,4,5,6,7,8,9,10,...

演算法小練習 根據上排數求下排數

參考 給你10分鐘時間,根據上排給出十個數,在其下排填出對應的十個數 要求下排每個數都是先前上排那十個數在下排出現的次數。上排的十個數如下 0,1,2,3,4,5,6,7,8,9 舉乙個例子,數值 0,1,2,3,4,5,6,7,8,9 分配 6,2,1,0,0,0,1,0,0,0 0在下排出現了6...

小韋老師 神犇營 my0215 求 e 的值

利用公式 e 1 1 1 1 2 1 3 1 n 求 e。輸入只有一行,該行包含乙個整數 n 2 n 20 表示計算 e 時累加到 1 n!輸出只有一行,該行包含計算出來的e的值,要求列印小數點後 10 位。102.7182818011思路 整體思路 求 1 1 1 1 2 1 3 1 n 的值,首...