Scala超入門
SparkのとっかかりとしてたぶんSparkの入門的なものであるAMPCampをさらってみています。
とりあえず、prerequireにあったScalaの超入門的なものをやりました。SparkはPythonでも動かせますが、真面目にやるにあたってはScalaは避けて通れませんので、当面はその辺りの勉強も必要ですね。
例ではScalaShellで動かしていましたが、Scala自体もほぼ初心者なので勉強を兼ねてソースコード化して動かしてみました。 Scalaはまだコップ本を読みつつなので、全然手に馴染んでないし、関数型っぽくうまく書けずまだまだだなぁ、と。2年くらい前にSICPの読書会に参加していた記憶よよみがえれ!
import scala.io.Source object Intro { // 3. cubeというInt型の値の3乗を計算する関数を定義 def cube(n: Int): Int = n * n * n // 6. 階乗を計算する関数を定義する。ループも再帰も使えるが、ここでは再帰を使う def factorial(n: Int): Int = { if (n == 0) 1 else n * factorial(n-1) } // ボーナス:ワードカウントの実装 // まだ良くわかっていないので答えをみた // mutableなHashMap使っているのでScalaらしくはない def wordcount(source: String): collection.mutable.Map[String, Int] = { val lines = Source.fromFile(source).getLines.toArray val counts = new collection.mutable.HashMap[String, Int].withDefaultValue(0) lines.flatMap(line => line.split(" ")).foreach(word => counts(word) += 1) return counts } def main(args: Array[String]) { // 2. myNumberというInt型のリストを定義 val myNumbers = List(1, 2, 3, 4, 5) // 4. 定義した関数をmyNumbersに提供する myNumbers.map(x => cube(x)) // myNumbers.map(cube) こっちのほうがscalaっぽい? // 5. 関数リテラル使って3,4と同じことを実現 myNumbers.map(x => x * x * x) // 6. 階乗を計算する関数を定義する。ループも再帰も使えるが、ここでは再帰を使う // factorialの定義は上部にて println(myNumbers.map(factorial)) // ボーナス:wordcountの実装 // sparkのREADME.mdをカレントディレクトリに持ってきた println(wordcount("README.md")) } }