全体的にやりたいこと
大量のCSVファイルをParquetに直す必要があるが、
そもそもCSVファイルのヘッダーにカラム名行が存在しないため、
・CSVファイルにヘッダー追加
・CSVをParquetに変換
この2ステップを行うツールを作成する必要がありました。
<<前提>>
CSVのヘッダーに追加するカラム名がParquetファイルの値に対するタイトルとなります。
もし、ヘッダー行が存在せず、いきなりデータが存在する場合、
出力したParquetファイルの各タイトルは、1行目のデータとなってしまいます。
PythonからShellを呼び出す
CSVのヘッダー行を追加する処理はPythonでも書くことができましたが、
Shellで比較的簡単に追加可能だったので、
Shellで作成し、そのファイルをPythonから呼び出すようにしました。
import subprocess
# comment
cmd = './add_header.sh'
subprocess.call(cmd, shell=True)
subprocessでShellを指定することで、
外部のShellファイルを呼び出すことができます。
##!/usr/bin/env bash
for file in `\find from_dir -maxdepth 1 -type f`; do
gsed -i '1iheader1,header2' $file
done
gsed呼び出し時の「1i」が必要になります。
gsed・・・gnu-sedのインストールをお願いします。
■実行結果CSVファイルのヘッダー
header1,header2
CSVをParquetに変換
S3上に存在する大量のCSVファイルをParquetに変換する必要がありました。
ファイルは全てローカルにダウンロードしている状態です。
import pyarrow as pa
import pyarrow.parquet as pq
import pandas as pd
import glob
from_dir = './from_dir/'
to_dir = './to_dir/'
#from_dir内のCSVを全て読み込む
files = glob.glob(from_dir + "*", recursive=True)
#1ファイルずつ変換し、to_dirに格納する
for file in files:
path_name = file.split('/')
df = pd.read_csv(file)
table = pa.Table.from_pandas(df)
pq.write_table(table, to_dir + path_name[2] + '.pq')
csvファイルの読み込み、出力はpandas
Parquetへの変換はpyarrowで簡単に可能です