【Python】CSV形式からParquet形式へ変換する方法

【Python】CSV形式からParquet形式へ変換する方法 プログラミング

「parquetという拡張子のファイルは、どうやって開くの?」
「CSVの容量でディスクの使用率がヤバくなってきた・・・」

このような場合には、この記事の内容が参考になります。
この記事では、Parquet形式のファイルについて解説しています。

本記事の内容

  • Parquetとは?
  • CSVからParquetへの変換
  • Parquetの読み込み

それでは、上記に沿って解説していきます。

Parquetとは?

「train.parquet」というファイル名を見たことがありませんか?
これは、Parquet形式のファイルになります。

Parquetとは、正式にはApache Parquet(アパッチ・パーケット)と言います。
このParquetの主な特徴は、以下となります。

  • 列ベースのフォーマット
  • 高効率なデータ圧縮・解凍

CSVは、行ベースのフォーマットです。
それに対して、Parquetは列ベースになります。

この比較で覚えれば、Parquet形式を覚えやすくなります。
また、データを効率良く圧縮することが可能です。

その結果、ディスク容量を削減することが可能になります。
それも件数が多ければ多いほど、よりディスク容量を削減できるようです。

10万件を超えたら、CSVの数パーセントの容量に削減可能という記事もあります。
果たして、これは本当なのでしょうか?

では、このことを以下で検証してみましょう。

CSVからParquetへの変換

CSVからParquetへの変換を行います。
郵便番号のCSVなら、簡単に手に入れることができます。

行数は、12万行以上あります。

変換するためには、以下のライブラリが必要となります。

  • Pandas
  • PyArrow

Pandasはすでにインストール済みかもしれません。
PyArrowについては、次の記事で解説しています。

必要ライブラリのインストールには、次のコマンドを利用します。

pip install pandas
pip install pyarrow

準備ができたら、次のコードを実行します。

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

df = pd.read_csv('./data/KEN_ALL.CSV', encoding="shift-jis")
table = pa.Table.from_pandas(df)
pq.write_table(table, './data/KEN_ALL.parquet')

上記を実行した結果、ファイルが作成されます。

約25%にまで削減することができました。
まだ、削減できるのを見てみたいですね。

では、さらに大きいCSVを対象にしてみましょう。

このCSVは、次のページ(全国版)から取得できます。
法人番号がダウンロードできるようです。
https://www.houjin-bangou.nta.go.jp/download/zenken/

行数は、500万行オーバーです。

おそらく、この大容量CSVをエクセルでは開けないかもしれません。
それでは、この大容量CSVをParquetに変換してみましょう。

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

df = pd.read_csv('./data/00_zenkoku_all_20221228.csv', encoding="shift-jis")
table = pa.Table.from_pandas(df)
pq.write_table(table, './data/00_zenkoku_all_20221228.parquet')

実行した結果は、以下。

約30%にまでにしか削減できていません。
ダイエットが足りませんね・・・

二つのCSVについて、まとめておきます。


行数列数圧縮率
郵便番号CSV1245631525%
法人番号CSV52552903030%

容量が3分の1になっている時点で、効果はあると言えます。
しかし、行数が増えればより圧縮率は高まるとか言うのはデマ(勘違い)なんでしょうかね?

それとも、前提となる条件が他にあるのかもしれません。
とにかく、3分の1以下にディスク容量を削減できることは確認できました。
これだけでも、十分過ぎる効果と言えます。

以上、CSVからParquetへの変換を説明しました。
次は、Parquetの読み込みを説明します。

Parquetの読み込み

Parquetの読み込みを行います。
先ほど、変換して作成したParquetファイルを読み込みましょう。

import pyarrow.parquet as pq

table = pq.read_table("./data/KEN_ALL.parquet")
df = table.to_pandas()

df.info()

上記を実行すると、データの情報が確認できます。

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 124562 entries, 0 to 124561
Data columns (total 15 columns):
 #   Column           Non-Null Count   Dtype 
---  ------           --------------   ----- 
 0   01101            124562 non-null  int64 
 1   060              124562 non-null  int64 
 2   0600000          124562 non-null  int64 
 3   ホッカイドウ          124562 non-null  object
 4   サッポロシチュウオウク     124562 non-null  object
 5   イカニケイサイガナイバアイ  124562 non-null  object
 6   北海道              124562 non-null  object
 7   札幌市中央区           124562 non-null  object
 8   以下に掲載がない場合       124562 non-null  object
 9   0                124562 non-null  int64 
 10  0.1              124562 non-null  int64 
 11  0.2              124562 non-null  int64 
 12  0.3              124562 non-null  int64 
 13  0.4              124562 non-null  int64 
 14  0.5              124562 non-null  int64 
dtypes: int64(9), object(6)
memory usage: 14.3+ MB

大きい方のデータも読み込んでみましょう。

<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 5255289 entries, 0 to 5255288 
Data columns (total 30 columns): 
 #   Column                                            Dtype   
---  ------                                            -----   
 0   1                                                 int64   
 1   1000012160153                                     int64   
 2   01                                                int64   
 3   1.1                                               int64   
 4   2018-04-02                                        object  
 5   2015-10-05                                        object  
 6   釧路検察審査会                                           object  
 7   Unnamed: 7                                        float64 
 8   101                                               int64   
 9   北海道                                               object  
 10  釧路市                                               object  
 11  柏木町4−7                                            object  
 12  Unnamed: 12                                       float64 
 13  01.1                                              float64 
 14  206                                               float64 
 15  0850824                                           float64 
 16  Unnamed: 16                                       object  
 17  Unnamed: 17                                       float64 
 18  Unnamed: 18                                       object  
 19  Unnamed: 19                                       float64 
 20  Unnamed: 20                                       float64 
 21  Unnamed: 21                                       object  
 22  2015-10-05.1                                      object  
 23  1.2                                               int64   
 24  Kushiro Committee for the Inquest of Prosecution  object  
 25  Hokkaido                                          object  
 26  4-7, Kashiwagicho, Kushiro shi                    object  
 27  Unnamed: 27                                       object  
 28  クシロケンサツシンサカイ                                      object  
 29  0                                                 int64   
dtypes: float64(8), int64(7), object(15) 
memory usage: 1.2+ GB

メモリが、1.2GB以上も利用されています。

コード的には、読み込んだデータをデータフレームに変換しています。
データフレームにさえ変換できれば、あとは何とでもできます。

以上、Parquetの読み込みを説明しました。

タイトルとURLをコピーしました