雑記帳

ソフトを中心に雑記を書いてる割とすぐ転職したい人。コメント貰えると私が喜びます。

PythonとSparkであそぼ(1)

背景

<< 略 >>
今をときめくインメモリ分散処理エンジンSparkを使いたいなぁと思ったりそうでもなかったりするから。 SQLチックに使えたり、機械学習エンジンあるしなんかスゲーじゃん?

参考

またどっかの本読んでます。
本家サイトでEarlyReleaseのEbookを買って読んでいたけど、今のKindle価格の方が安かったりするというちょっと残念な話。

Learning Spark: Lightning-Fast Big Data Analysis

Learning Spark: Lightning-Fast Big Data Analysis

環境

  • 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']
演算結果の再利用

RDDfirstなどの命令を呼び出す度に毎回再計算する。
何度も利用するデータの場合はメモリ上に残す方が良いので残す

>>> pythonLines.persist()
RDDの作り方

方法は2つだけ。
1つは上のテキストから読み出す方法。
もう1つはparallelize()メソッドを使う方法。

>>> lines = sc.parallelize(["pandas","i like pandas"])
RDDの操作

RDDにはtransformationsactionsの2種類の操作方法がある。
前者はmapfilterのなどで、演算の結果、新たなRDDを返すもの。
後者はcountfirstのように別の形式のデータを返したり、演算を実行する、データをストレージに書き出すなどの操作をするもの。(RDDを返す物は違う)

TransformationsActionsの例

上でも言ったが、RDDを返す操作がTransformationsに該当。それ以外はActionsになる。
ここではfilterで削減された結果のRDDunionでくっつけて、全部を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については、HaskellLINQみたいに遅延評価されるぜ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)
一般的なTransformationsActions

ここ読んでね。

https://spark.apache.org/docs/latest/programming-guide.html#transformations

  • Transforms

    • 要素毎への変換処理

      mapflatmapがあり、配列の各要素に対して同じ処理をするもの。
      処理に突っ込んだ関数の処理結果がリストの場合、mapはリストのリストを返すが、flatmapは単にリストで返す。

    • 擬似集合(?)

      distinctは重複を排除した配列を返す。
      unionは結合した配列を返す。
      intersectionは共通要素の配列を返す。
      substractは要素の引き算。
      certesianは全ての組み合わせを作った配列を返す(掛け算)。

  • Actions

    • reduceは有名。組み込み関数のreduceと同じ。
    • foldもだいたい同じ。
    • aggregateが分からんけど、最新のドキュメントに無いぞ?
    • collectは全部の要素を返す
    • takeは先頭からn個だけ返す
  • キャッシング

    • persistのこと
      MEMORY_ONLYとかDISK_ONLYとか種類があるようだけどまだ良く分かんね。

むぅ〜〜

近くならこういうのに参加して知り合いを作りたいのですが、、、、
なので、とりあえずこれよりは早いペースで読んでいきたいです。
誰か僕とお友達になってよ。

readlearningspark.connpass.com

BGM

こんなの聞きながらダラダラやってました。
アニメ、とても面白かったのでお勧めです。

四月は君の嘘 僕と君との音楽帳

四月は君の嘘 僕と君との音楽帳