ここ1年くらい暇を見つけてちまちまと遊んでいたCourseraの "Functional Programming in Scala Specialization" という一連のプログラムを修了した。
4つのコースから構成されていて、(修了証は出ないけど)課題を含めてすべて無料で受講できた。課題はスケルトンコードとデータが与えられて、指定されたメソッドを実装する、というよくある形式。
- Functional Programming Principles in Scala
- 関数型プログラミングの基礎
- パターンマッチとか高階関数とかImmutableなデータ構造の話とか
- Functional Program Design in Scala
- 発展的な関数型プログラミングの概念いろいろ
- モナモナしたり、遅延評価したり
- Parallel Programming
- タスク並列化とデータ並列化
.par
を付けるとできる、Scala の並列コレクションに対する操作いろいろ
- Big Data Analysis with Scala and Spark
- Sparkを使おう
RDD
,Dataset
,DataFrame
それぞれの操作
Functional Programming Principles in Scala では、var
(と val
)を絶対に使わないという強い意志を持って、再帰を駆使してコードを書く。普段ノリでScalaを書いていると気がついたらJavaになっているが、このコースが最初にあったおかげで、始終冷静にScalaが書けた気がする。ハマりどころは特に無いけど、Scalaじゃなくても良いよね感がすごいので飽きる。
Functional Program Design in Scala は講義が苦痛だが、どの資料をあたってもモナドとは常にそういうものである。諦めよう。課題では Stream
や ScalaCheck が出てくる。遅延評価の話と Stream
の導入はわかりやすくて良かった。
そして Parallel Programming。ここからがこのプログラムのメイン。まずは Parallel Programming(並列プログラミング)と Concurrent Programming(並行プログラミング)の違いから講義が始まる。受講当時ちょうど The Art of Concurrency を読んでいたこともあって、この点は以前記事にもまとめた:
call-by-nameで引数を評価することの重要性や、再帰的な処理・コレクション操作の並列化など、これまでの『関数型言語としてのScala』の講義を踏まえて教えてくれたのが印象的で、「あーここでその話が出てくるのかー」という体験が多くて良かった。
課題では k-means を実装したのが特に楽しかった。馴染みのある実用的なアルゴリズムが動くと嬉しくなる。
最後のコース Big Data Analysis with Scala and Spark では、その名の通りSparkを学ぶ。Stack Overflowなどの実データ(?)を対象に課題に取り組めるのも嬉しい。
このコースは『なぜSparkか』というところから話が始まる。わかりやすくて納得感があったので、記事でもまとめた:
そして RDD
の解説が始まる。キャッシュの重要性を口酸っぱく言われるので、これについてもブログでまとめておいた:
課題になると、Parallel Programming で実装した k-means を今度はSpark RDDを使って実装する。これがかなりハマって、しばらく放置していたら修了まで随分時間がかかってしまった…。
そんな「RDDを効率的・効果的に扱うのは大変だよね?」という文脈から、Catalystによる最適化の恩恵を受けるべく DataFrame
が紹介される。そして最後には RDD
と DataFrame
のハイブリッド的存在として Dataset
が登場して完結。
まとめ
『関数型言語としてのScala』から『Sparkによるビックデータ解析』までを学べる、楽しいプログラムだった。おすすめ。
もっと効率よく学べる資料も世の中にたくさんあるんだろうけど、課題がかなりよくできていたので個人的には非常に満足度が高い。並列コレクションやRDDのキャッシュを適切に扱えないとタイムアウトやOOMで不合格になるので、あやふやな理解とノリで書いたコードでは通らない。厳しい。試行錯誤の末 Discussion Forum に助けを求めにいったこともしばしば。
シェアする
サポートする(ありがとうございます)
あわせて読みたい
- 2020-09-12
- なぜUI/UXデザイナーの仕事は批判の的になるのか?その謎を解明すべく我々は(以下略)
- 2017-10-01
- Pythonのconcurrent.futuresを試す
- 2017-04-09
- なぜSparkか
書いた人: たくち
たくちです。長野県出身、カナダ・バンクーバー在住のソフトウェアエンジニア。これまでB2B/B2Cの各領域で、データサイエンス・機械学習のプロダクト化および顧客への導入支援・コンサルティング、そして関連分野のエバンジェリズムに携わってきました。趣味は旅行、マラソン、登山、ブリュワリー巡り。近況は takuti.me/now より。ブログへのご意見・ご感想など、@takuti または [email protected] までいつでもお気軽にご連絡ください。
※当サイトおよび関連するメディア上での発言はすべて私個人の見解であり、所属する(あるいは過去に所属した)組織のいかなる見解を代表するものでもありません。
過去の人気記事
- 2021-08-12
- いい加減、プロダクトマネージャーという職業に幻想を抱くのはやめよう。
- 2017-12-16
- データサイエンスプロジェクトのディレクトリ構成どうするか問題
- 2017-06-10
- Amazonの推薦システムの20年