PythonとSparkであそぼ(1)
背景
<< 略 >>
今をときめくインメモリ分散処理エンジンSparkを使いたいなぁと思ったりそうでもなかったりするから。
SQLチックに使えたり、機械学習エンジンあるしなんかスゲーじゃん?
参考
またどっかの本読んでます。
本家サイトでEarlyReleaseのEbookを買って読んでいたけど、今のKindle価格の方が安かったりするというちょっと残念な話。
Learning Spark: Lightning-Fast Big Data Analysis
- 作者: Holden Karau,Andy Konwinski,Patrick Wendell,Matei Zaharia
- 出版社/メーカー: O'Reilly Media
- 発売日: 2015/01/28
- メディア: Kindle版
- この商品を含むブログを見る
環境
- MacBook Pro Yosemite
- ローカル環境
(Sparkを使えるようになるのを目的にしてるので、とりあえず分散処理とかやりません)
読んでみる
1章は何やら色々書いてありますが知りません。
2章はインストール方法なので飛ばします。
homebrewでインストールできます。
$ brew install apache-spark
3章 RDDといっしょ
RDD?
Sparkで扱う基本のデータの形式。
resilient distributed datasetの略。
直訳すると「弾力性のある分散型のデータセット」らしい。
使うデータ
テキトウなテキストファイル
とりえあず例:テキストファイルを読んでフィルタをかける
下のやり方で"Python"という文字が入っている行だけ抜き出せる。
その上で少しだけ読みだす。
>>> lines = sc.textFile("README.md") >>> pythonLines = lines.filter(lambda line: "Python" in line) >>> pythonLines.first() u'* The Python examples require urllib3' >>> pythonLines.take(2) [u'* The Python examples require urllib3', u'Python examples']
演算結果の再利用
RDDのfirst
などの命令を呼び出す度に毎回再計算する。
何度も利用するデータの場合はメモリ上に残す方が良いので残す
>>> pythonLines.persist()
RDDの作り方
方法は2つだけ。
1つは上のテキストから読み出す方法。
もう1つはparallelize()
のメソッドを使う方法。
>>> lines = sc.parallelize(["pandas","i like pandas"])
RDDの操作
RDDにはtransformations
とactions
の2種類の操作方法がある。
前者はmap
やfilter
のなどで、演算の結果、新たなRDDを返すもの。
後者はcount
やfirst
のように別の形式のデータを返したり、演算を実行する、データをストレージに書き出すなどの操作をするもの。(RDDを返す物は違う)
Transformations
とActions
の例
上でも言ったが、RDDを返す操作がTransformations
に該当。それ以外はActions
になる。
ここではfilter
で削減された結果のRDDをunion
でくっつけて、全部をprintする処理を書く。
>>> inputRDD = sc.textFile("README.md") >>> ex = inputRDD.filter(lambda line: "example" in line) >>> py = inputRDD.filter(lambda line: "Python" in line) >>> uni = ex.union(py) >>> c = uni.count() >>> print c 9 >>> for x in uni.take(c): ... print(x) ... [![buildstatus](https://travis-ci.org/holdenk/learning-spark-examples.svg?branch=master)](https://travis-ci.org/holdenk/learning-spark-examples) Examples for the Learning Spark book. These examples require a number of libraries and as such have long build files. We have also added a stand alone example with minimal dependcies and a small build file in the mini-complete-example directory. * The Python examples require urllib3 Python examples From spark just run ./bin/pyspark ./src/python/[example] cd $SPARK_HOME; ./bin/spark-submit --class com.oreilly.learningsparkexamples.[lang].[example] ../learning-spark-examples/target/scala-2.10/learning-spark-examples-assembly-0.0.1.jar * The Python examples require urllib3 Python examples
Lazy Evaluation
Transformations
については、HaskellやLINQみたいに遅延評価されるぜv( ̄Д ̄)v イエイ
無理やり動かしたいならcount()
のようなAction
を動かしましょう。
関数の渡し方
言語によって渡し方があります。
Pythonではスコープ内の関数を渡すのが良いらしい。
- ダメな例
class someclass(): def __init__(self,query): self.query = query def getmatches(self,rdd): return rdd.filter(lambda x: self.query in x)
- 良い例
class someclass(): def __init__(self,query): self.query = query def getmatches(self,rdd): q = self.query return rdd.filter(lambda x: q in x)
一般的なTransformations
とActions
ここ読んでね。
https://spark.apache.org/docs/latest/programming-guide.html#transformations
Transforms
要素毎への変換処理
map
とflatmap
があり、配列の各要素に対して同じ処理をするもの。
処理に突っ込んだ関数の処理結果がリストの場合、mapはリストのリストを返すが、flatmapは単にリストで返す。擬似集合(?)
distinct
は重複を排除した配列を返す。
union
は結合した配列を返す。
intersection
は共通要素の配列を返す。
substract
は要素の引き算。
certesian
は全ての組み合わせを作った配列を返す(掛け算)。
Actions
reduce
は有名。組み込み関数のreduceと同じ。fold
もだいたい同じ。aggregate
が分からんけど、最新のドキュメントに無いぞ?collect
は全部の要素を返すtake
は先頭からn個だけ返す
キャッシング
persist
のこと
MEMORY_ONLYとかDISK_ONLYとか種類があるようだけどまだ良く分かんね。
むぅ〜〜
近くならこういうのに参加して知り合いを作りたいのですが、、、、
なので、とりあえずこれよりは早いペースで読んでいきたいです。
誰か僕とお友達になってよ。
readlearningspark.connpass.com
BGM
こんなの聞きながらダラダラやってました。
アニメ、とても面白かったのでお勧めです。
- アーティスト: 四月は君の嘘 僕と君との音楽帳
- 出版社/メーカー: Sony Music Labels Inc.
- 発売日: 2014/11/19
- メディア: MP3 ダウンロード
- この商品を含むブログを見る
【Amazon.co.jp限定】四月は君の嘘 2(完全生産限定版)(クリアブックマーカーver.2付) [Blu-ray]
- 出版社/メーカー: アニプレックス
- 発売日: 2015/03/25
- メディア: Blu-ray
- この商品を含むブログを見る