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 的值,首...