備忘録がてらメモ。
最近、ビッグデータを扱うプロジェクトでは「Parquet」という列指向フォーマット(カラムナフォーマット)が好まれるようになってきた。
Parquetの利点は、なんといってもデータの読み込みの速さとストレージ容量の節約にあるだろう。
今回はPythonのpandasを利用して、CSV形式のファイルを読みこんでParquet形式のファイルに変換する簡単な方法をメモしておく。
今回は、次のようなCSVファイルを用意した。
例: data.csv
"id","name","rating","birthday","registered_at"
"1","ラオウ","5.1","1990-01-01","2023-01-01 01:01:01"
"2","トキ","4.2","1991-01-02","2023-01-02 02:02:02"
"3","ジャッカル","3.3","1992-01-03","2023-01-03 03:03:03"
"4","ケンシロウ","2.4","1993-01-04","2023-01-04 04:04:04"
※ UTF-8形式で保存する前提
そして以下のようなPythonのプログラムで変換をかける
例: csv_to_parquet.py
import pandas as pd
from datetime import datetime
dtype = {
'id': 'long',
'rating': 'double',
'birthday': 'str',
'registered_at': 'str'
};
parse_dates = [3, 4] # timestampとして利用するカラムを指定する
df = pd.read_csv("data.csv", encoding='utf-8', dtype = dtype, parse_dates = parse_dates)
df.to_parquet("data.parquet")
注意すべきは[parse_dates]というパラメータで、ここにはtimestampとして利用したいカラムを指定するということ。
これによってCSV自体を読み込む際は[dtype]で[str]を指定しておき、その後timestampに変換をかけるような動きとなる。
逆にtimestampへの変換を行わずに文字列として保存したい場合は、この[parse_dates]を指定しなければOK。
出力が終わったら[parquet-cli]等で内容を確認する
例: 確認コマンド結果 (スキーマ)
$parquet schema data.parquet
{
"type" : "record",
"name" : "schema",
"fields" : [ {
"name" : "id",
"type" : [ "null", "long" ],
"default" : null
}, {
"name" : "name",
"type" : [ "null", "string" ],
"default" : null
}, {
"name" : "rating",
"type" : [ "null", "double" ],
"default" : null
}, {
"name" : "birthday",
"type" : [ "null", {
"type" : "long",
"logicalType" : "timestamp-micros"
} ],
"default" : null
}, {
"name" : "registered_at",
"type" : [ "null", {
"type" : "long",
"logicalType" : "timestamp-micros"
} ],
"default" : null
} ]
}
例: 確認コマンド結果 (データ)
$parquet cat data.parquet # 内容確認
{"id": 1, "name": "ラオウ", "rating": 5.1, "birthday": 631152000000000, "registered_at": 1672534861000000}
{"id": 2, "name": "トキ", "rating": 4.2, "birthday": 662774400000000, "registered_at": 1672624922000000}
{"id": 3, "name": "ジャッカル", "rating": 3.3, "birthday": 694396800000000, "registered_at": 1672714983000000}
{"id": 4, "name": "ケンシロウ", "rating": 2.4, "birthday": 726105600000000, "registered_at": 1672805044000000}
ちなみに注意点としては、このtimestampの扱いがParquetのフォーマットのバージョンによって異なるということ。
例えばAWSのRedshift Spectrumでは、timestampの型をint96に指定しなければ読み込まれないなどの落とし穴がある。
尚、このint96の指定は現在は非推奨になっており、先ほど利用した[parquet-cli]の最新版では読み込みに失敗したりする。
あぁ、ややこしや、ややこしや。