PySparkをREPLで簡単に試す

PythonからApache Sparkを操作するためのライブラリPySparkをなんとなく触れてみたいと思います。

# PySparkをインストール

自分はvenvを使って仮想環境を作って試してみました。

```bash
$ python -m venv pyspark-samples
$ source ./python-samples/bin/activate
$ pip install pyspark
```

# テストデータをダウンロード

このあたりから適当なCSVをダウンロードして、上記で作成したpython-samplesディレクトリに配置しました。

https://github.com/codeforamerica/ohana-api/blob/master/data/sample-csv/addresses.csv

# REPLを起動

```bash
$ cd ./python-samples
$ python
```

# Sparkをインポート

こちらの[ドキュメント](https://spark.apache.org/docs/latest/sql-getting-started.html#starting-point-sparksession)の通りにSparkSessionのインスタンスを作ります。

REPL上でペーストしましょう。

```python
>>> from pyspark.sql import SparkSession
>>>
>>> spark = SparkSession \
...     .builder \
...     .appName("Python Spark SQL basic example") \
...     .config("spark.some.config.option", "some-value") \
...     .getOrCreate()
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
24/04/10 23:11:32 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
>>>
```

# CSVを読み込んでみる

```python
>>> df = spark.read.format("csv").option("header", True).load("addresses.csv")
>>> df.show(10)
```

<details>

```
+---+-----------+--------------------+---------+------------+--------------+-----------+-------+
| id|location_id|           address_1|address_2|        city|state_province|postal_code|country|
+---+-----------+--------------------+---------+------------+--------------+-----------+-------+
|  1|          1|2600 Middlefield ...|     NULL|Redwood City|            CA|      94063|     US|
|  2|          2|    24 Second Avenue|     NULL|   San Mateo|            CA|      94401|     US|
|  3|          3|    24 Second Avenue|     NULL|   San Mateo|            CA|      94403|     US|
|  4|          4|    24 Second Avenue|     NULL|   San Mateo|            CA|      94401|     US|
|  5|          5|    24 Second Avenue|     NULL|   San Mateo|            CA|      94401|     US|
|  6|          6|   800 Middle Avenue|     NULL|  Menlo Park|            CA| 94025-9881|     US|
|  7|          7|      500 Arbor Road|     NULL|  Menlo Park|            CA|      94025|     US|
|  8|          8|   800 Middle Avenue|     NULL|  Menlo Park|            CA| 94025-9881|     US|
|  9|          9|2510 Middlefield ...|     NULL|Redwood City|            CA|      94063|     US|
| 10|         10|1044 Middlefield ...|     NULL|Redwood City|            CA|      94063|     US|
+---+-----------+--------------------+---------+------------+--------------+-----------+-------+
only showing top 10 rows
```

</details>

# SQLで検索してみる

SQLにはFROM句があります。先に、FROM句に渡すための名前をつけます。

```python
>>> df.createOrReplaceTempView("test")
```

SQLで検索してみましょう。

```python
>>> results = spark.sql("""SELECT id, city FROM test LIMIT 10""")
>>> results.show(10)
```

<details>

```
+---+------------+
| id|        city|
+---+------------+
|  1|Redwood City|
|  2|   San Mateo|
|  3|   San Mateo|
|  4|   San Mateo|
|  5|   San Mateo|
|  6|  Menlo Park|
|  7|  Menlo Park|
|  8|  Menlo Park|
|  9|Redwood City|
| 10|Redwood City|
+---+------------+
```

</details>

# おわりに

Apache Sparkと聞くとなんかビッグデータとか難しそうっていう印象を持たれるかもしれませんが、実態はそんなことはありません。
本記事のようにREPLを使って試すこともできます。
Apache Sparkにはいろいろな機能があるので是非本記事をとっかかりにして色々触ってもらえると幸いです。