Unknown Region

プログラムでハマったエラーとその解決方法についての備忘録メモ

【Python】pandasでCSVファイルをParquetファイルへ変換する

備忘録がてらメモ。

最近、ビッグデータを扱うプロジェクトでは「Parquet」という列指向フォーマット(カラムナフォーマット)が好まれるようになってきた。

parquet.apache.org

Parquetの利点は、なんといってもデータの読み込みの速さとストレージ容量の節約にあるだろう。

今回はPythonpandasを利用して、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]等で内容を確認する

github.com

例: 確認コマンド結果 (スキーマ)

$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のフォーマットのバージョンによって異なるということ。

例えばAWSRedshift Spectrumでは、timestampの型をint96に指定しなければ読み込まれないなどの落とし穴がある。

tkr911.hatenablog.com

尚、このint96の指定は現在は非推奨になっており、先ほど利用した[parquet-cli]の最新版では読み込みに失敗したりする。

あぁ、ややこしや、ややこしや。

 

連絡先: plugout777★yahoo.co.jp (クローラー対策のため★を@に変更してください)