1
0

More than 3 years have passed since last update.

Python上でShellファイルを呼び出した後、CSVをParquetに変換する。

Last updated at Posted at 2020-03-19

全体的にやりたいこと

大量のCSVファイルをParquetに直す必要があるが、
そもそもCSVファイルのヘッダーにカラム名行が存在しないため、
・CSVファイルにヘッダー追加
・CSVをParquetに変換
この2ステップを行うツールを作成する必要がありました。

<<前提>>
CSVのヘッダーに追加するカラム名がParquetファイルの値に対するタイトルとなります。
もし、ヘッダー行が存在せず、いきなりデータが存在する場合、
出力したParquetファイルの各タイトルは、1行目のデータとなってしまいます。

PythonからShellを呼び出す

CSVのヘッダー行を追加する処理はPythonでも書くことができましたが、
Shellで比較的簡単に追加可能だったので、
Shellで作成し、そのファイルをPythonから呼び出すようにしました。

qiita.py
import subprocess

# comment
cmd = './add_header.sh'
subprocess.call(cmd, shell=True)

subprocessでShellを指定することで、
外部のShellファイルを呼び出すことができます。

add_header.sh
##!/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に変換する必要がありました。
ファイルは全てローカルにダウンロードしている状態です。

qiita2.py
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で簡単に可能です

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0