本エントリでは、IntelliJ IDEAを使って、
pysparkの開発環境を設定する手順を示します。

# 私はIntelliJ IDEA Ultimate Editionを使っていますが、
# CEやpycharmでも、おそらく同様の手順だと思います。

以下の流れで手順を進めていきます。

  • Apache Sparkのダウンロードと展開
  • pyspark用のPythonプロジェクト作成
  • サンプルコードを作成
  • 単体テストの実行
  • IntelliJ IDEAでプロジェクトを開きSDKを設定
  • IntelliJ IDEAでの単体テスト実行

Apache Sparkのダウンロードと展開

spark.apache.orgから、Apache Sparkをダウンロードします。

Downloads | spark.apache.org
https://spark.apache.org/downloads.html

このエントリの手順では「spark-2.4.0-bin-hadoop2.7.tgz」をダウンロードしました。

このファイルを適当な場所に展開します。

$ tar zxf spark-2.4.0-bin-hadoop2.7.tgz

以下のようにspark-shellを実行してversionが表示されることを確認します。

$ export SPARK_HOME=※展開先※/spark-2.4.0-bin-hadoop2.7
$ $SPARK_HOME/bin/spark-shell --version

pysparkのバージョン確認

以下のように、展開したApache Sparkに含まれるpysparkのバージョンを確認します。

$ head $SPARK_HOME/python/pyspark.egg-info/PKG-INFO
Metadata-Version: 2.1
Name: pyspark
Version: 2.4.0
Summary: Apache Spark Python API
Home-page: https://github.com/apache/spark/tree/master/python
Author: Spark Developers
Author-email: dev@spark.apache.org
License: http://www.apache.org/licenses/LICENSE-2.0
Description: Apache Spark

ここでは、「2.4.0」が含まれている事が確認出来ました。

pyspark用のPythonプロジェクト作成

以下のように、pysparkを使うサンプルモジュールのディレクトリを準備します。

$ mkdir pyspark-sample
$ cd pyspark-sample
$ mkdir pysparksample tests
$ touch pysparksample/__init__.py tests/__init__.py

venvで仮想環境を作り、切り替えます。

$ python3 -m venv venv
$ source venv/bin/activate

前項で確認したpysparkのversionを指定して、pysparkをインストールします。

$ pip install pyspark==2.4.0

サンプルコードを作成

以下のようなサンプルコードを作成します。

pysparksample/main.py

from pyspark.sql import SparkSession, SQLContext

def target():
  spark = SparkSession.builder.appName('sample').getOrCreate()
  sqlContext = SQLContext(spark)
  df = sqlContext.createDataFrame([(1, "one"), (2, "two"), (3, "three")], ["id", "body"])
  return df

tests/test_main.py

import unittest
from pysparksample import main

class TestCases(unittest.TestCase):
  def test_sample(self):
    df = main.target()
    self.assertEqual(3, df.groupby().count().first()['count'])

単体テストの実行

単体テスト用にpytestをinstallします。

$ pip install pytest

以下のように単体テストが実行されることを確認します。

$ pytest tests/
======================== test session starts ========================
platform darwin -- Python 3.6.5, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
rootdir: /Users/mikamitakeshi/tmp/pyspark-sample, inifile:
collected 1 item                                                    

tests/test_main.py .                                          [100%]

===================== 1 passed in 8.26 seconds ======================

# 失敗する場合は、環境変数「SPARK_HOME」が正しいかを確認します。

IntelliJ IDEAでプロジェクトを開きSDKを設定

IntelliJ IDEAを起動し、
Openから、pyspark用のPythonプロジェクトを指定して開きます。

プロジェクトを開いた後、
File → Project Structure メニューを選択します。

intellijpyspark-01

ProjectSDK → New から 「Python SDK」を選択します。

intellijpyspark-02

Virtualenv Environment を選び、
Existing environmentで、「※プロジェクトのパス※/venv/bin/python」を指定します。

intellijpyspark-03

「pysparksample/main.py」を開き、
ライブラリ依存関係のエラーが出ていないことを確認します。

IntelliJ IDEAでの単体テスト実行

「tests/test_main.py」を開き、
Run → Edit Configuration メニューを選択し、
Python Test → Unittests を選びます。

intellijpyspark-04

Environment Variablesを選択し、
環境変数「SPARK_HOME」を追加します。
(「Apache Sparkのダウンロードと展開」項で指定した値)

intellijpyspark-05

「tests/test_main.py」コードの左側の三角記号から、
単体テストを実行します。

intellijpyspark-06

以上の手順によって、IntelliJ IDEAでpyspark用の開発環境の設定ができました。

ここまで書いておいてアレですが、
Pythonを使う特別な理由が無ければ、
Apache Sparkでの開発は、Scalaを使った方が楽かなと思います(個人的には)。