この記事について
Databricks社が開発したpandas likeにSparkを動作させるライブラリ、Koalasについてのメモ書きです。 ほぼ公式ドキュメントの日本語訳
koalasは更新が速いライブラリなので、2019年5月4日時点での情報であることをご留意ください。
Koalasって?
pandasとPysparkデータフレームでインタフェースが違うところ、
例えばこういうやつら↓、
- データ結合
- pandas ->
merge
- Pyspark ->
join
- pandas ->
- 列選択
- pandas ->
df[["col1", "col2"]]
- Pyspark ->
df.select("col1", "col2")
- pandas ->
を覚えるの大変だから、pandasのような操作感でSpark動かせたら良いよねっていう思想で作られたライブラリ。すでにPysparkをある程度触ってる人がkoalasに乗り換えるというより、今までpandasメインで使ってきた人が、スムーズにSparkを動かせたら良いなーとのこと。
思想としては、Daskに触発されたらしい。
Sparkは2.4以降をサポートするとのこと。古いバージョンでも動くかもしれないけど保証はしないとのこと。
(Spark 2.4ってこの前出たばっかなのにずいぶん男前だな…w)
プロジェクトとしては 鋭意開発中 で、週単位でリリースしていくよ!とのこと。
実際に使ってみる
Databricks(Databricks Runtime 5.3)上で試しに使ってみる。
koalasをインストールする。ついでにnumpyがちょっと古いよって怒られたのでバージョンを上げる。
dbutils.library.installPyPI("Koalas")
dbutils.library.installPyPI("numpy", "1.12.0")
dbutils.library.restartPython()
koalasをインポートしてみる
import databricks.koalas as ks
しかし、ここで残念ながらエラーが出てしまった。
File "/local_disk0/pythonVirtualEnvDirs/virtualEnv-4735ad99-9fc8-4ac4-b1f9-de2e04aeb1b5/lib/python3.5/site-packages/databricks/koalas/frame.py", line 1073
self._sdf: spark.DataFrame = kdf._sdf
^
SyntaxError: invalid syntax
うーーーーん。。
ちょうど今日コミットされたところだから、すぐ直るんだろうけども、。、
あとでissue上げとこう。。
2019/05/07追記: 今度こそ試してみる
@harupy様のコメントを参考に、 koalas
のバージョンを0.1.0に戻して試してみた。
無事動作。
ちなみに、0.3.0は上記とは別のエラーが出てしまいまたもや動作せず・・・。
前回同様Databricks上でチャレンジ。
dbutils.library.installPyPI("Koalas","0.1.0")
dbutils.library.installPyPI("numpy", "1.12.0")
dbutils.library.restartPython()
import databricks.koalas as ks
import pandas as pd
import numpy as np
print(ks.__version__)
>>>0.1.0
バージョン0.1.0でトライ。
適当なデータフレームを作ってみる。
kdf = ks.from_pandas(pd.DataFrame({"A":[x for x in range(100)], "B":[x**2 for x in range(100)], "C":np.random.randint(0,5,100)}))
print(kdf.shape)
print(len(kdf))
上手く伝えられないのが残念ですが、このコードを実行すると、Databricksのプログレスバーが出ます。確かにSparkが動いてる。
groupbyしてみる
agg_kdf = kdf.groupby('C').agg({'B': 'max', 'A': 'sum'})
agg_kdf.toPandas()
インタフェースは完全にpandasですね。
.head()
はサポートされていないようなので、DataFrameの中身を見るためには、 toPandas()
がとりあえず有効です。
ちなみに、未実装のメソッドも当然ながら多く、未実装のメソッドを実行するとこんな感じのエラーが出てしまいます。
kdf.query("A == B")
ありのまま感がすごい。
PandasNotImplementedError: The method `pd.DataFrame.query()` is not implemented yet.
まとめ
絶賛開発中で不安定ではありますが、Sparkが活躍するような大規模データをpandas-likeに処理できることができました。
pandasはpythonでデータ分析を行う人であれば誰でも触るライブラリですし、koalasでもっと柔軟な処理ができるとお手軽に大規模データを扱うことができて良さそうですね。定期的に見守っていきたいと思います。