pandasとApache Arrowを利用して、ローカル環境でcsvファイルをparquetファイルに変換する方法を記載します。ファイルサイズの小さいものであれば、今回の方法で対応できます。
そもそもparquetとは、
Apache Parquet is a columnar storage format available to any project in the Hadoop ecosystem, regardless of the choice of data processing framework, data model or programming language. https://parquet.apache.org/
つまり、列志向でデータ処理できるようになるファイルフォーマットです。以下のようなデータ処理基盤を利用している際に、parquet形式でファイルを格納していると、列志向でデータ処理を実行できるようになります。
csvやjsonフォーマットから、parquetフォーマットにファイルフォーマットに変換する方法ですが、AWSであればGlueがあるので、Glueを利用すれば簡単に変換できます。その他、InfomaticaやTalendといったGUI系のETLツールや、各種Hadoop Ecosystem上でも、parquetフォーマットに変換する機能を(きっと)有していると思います。今回の方法は、ローカル環境で、Pythonプログラムにて変換する方法となります。
変換にはpandasとApache Arrowを利用します。pandasはいいとして、Apache Arrowって何だという話ですが、
Apache Arrowとは、
Apache Arrow is a cross-language development platform for in-memory data. It specifies a standardized language-independent columnar memory format for flat and hierarchical data, organized for efficient analytic operations on modern hardware. https://arrow.apache.org/
インメモリでデータ処理する際に便利となるデータフォーマットです。公式サイトにある下記の図を見ると、Arrowフォーマットの役割を理解しやすいです。
今回の変換処理では、このApache ArrowのPython用Interfaceとなる pyarrow
を利用します。PyArrowの公式サイトはこちら。
https://pypi.org/project/pyarrow/
実際の変換処理については、PyArrowの以下の公式サイトで紹介してくれているので、その手順に従って作業します。
https://arrow.apache.org/docs/python/parquet.html
環境情報
PyArrowのインストール
pipコマンドでインストールできます。
> pip install pyarrow
WindowsでPyArrowを利用するには、 Visual C++
のパッケージが必要です。詳しくは以下の公式サイトに書いてあります。
https://arrow.apache.org/docs/python/install.html
公式サイトに、WindowsでPyArrowを利用するには、 Python 3.5 and higher
と書いてあるのに、 Python 3.7.0
ではPyArrowをインストールできませんでした。3.6.6のPython環境で試したところ、ちゃんとインストールできました。そのうち対応されると思いますが、現時点では、3.5か3.6のPythonのみで利用できるぽいですね。
csvファイルからparquetファイルに変換
ここからは、公式サイトの情報に従って処理します。
とりあえず、pandasとpyarrowモジュールをインポート。
>>> import pandas as pd >>> import pyarrow as pa >>> import pyarrow.parquet as pq
parquetファイルに変換したいcsvファイルを、pandasのデータフレームに変換します。
>>> df = pd.read_csv("C:/tmp/sample.csv")
上記で作成したデータフレームを、pyarrow.Table.from_pandas
という関数を利用して、parquetテーブルに変換します。
>>> table = pa.Table.from_pandas(df)
parquetテーブルにあるデータを、書き出してあげます。これでparquetフォーマットのファイルを作成できました。
>>> pq.write_table(table, "C:/tmp/sample.parquet")
pandasでは、parquetフォーマットファイルを読み込むのは、以下な感じですね。
>>> df = pd.read_parquet("C:/tmp/sample.parquet", columns="DAY_OF_WEEK")
今回の方法では、pandasのデータフレームに変換する処理が挟まれているので、サイズの大きいファイルでは対応できない場合があります。(pandasで利用するためのメモリが足りなくなる場合あるため)そういった場合には、素直にHadoopやETLツールを利用しましょう。小さいファイルでparquetを試したい場合に有効となる方法となります。