csvファイルをparquetファイルに変換する

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形式でファイルを格納していると、列志向でデータ処理を実行できるようになります。

  • Hadoop Ecosystem
    • Hive
    • Spark
    • Presto
  • AWSでは
    • Athena
    • Redshift Spectrum

csvjsonフォーマットから、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フォーマットの役割を理解しやすいです。

f:id:goodbyegangster:20180909201222p:plain

今回の変換処理では、この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を試したい場合に有効となる方法となります。