PythonでParquetをJSONに変換する方法
Emily Parker
Product Engineer · Leapcell

Key Takeaways
- Pythonのライブラリ(PandasやPyArrowなど)を使うと、ParquetからJSONへの変換が簡単になります。
- 大量のParquetファイルを効率的に処理するには、チャンク処理が不可欠です。
- 適切なエンジン(PyArrow、FastParquet、DuckDB)を選ぶことは、パフォーマンスと互換性に影響します。
Parquetは、Apache SparkやHadoopのようなビッグデータ処理フレームワークで広く使用されている、パフォーマンスとストレージ効率のために最適化されたカラム型ストレージ形式です。一方、JSON(JavaScript Object Notation)は、データ交換によく使用される、軽量で人間が読みやすい形式です。ParquetファイルをJSONに変換することは、JSONを好むシステムとデータを共有したり、より簡単にデータを検査したりする場合に不可欠になることがあります。
このガイドでは、Pythonを使用してこの変換を実行する方法を説明し、さまざまなシナリオに適したさまざまな方法を取り上げます。
前提条件
開始する前に、必要なPythonライブラリがインストールされていることを確認してください。pipを使用してインストールできます。
pip install pandas pyarrow fastparquet
pandas
: データ操作と分析用。pyarrow
: Apache Arrow用のPythonバインディングを提供し、Parquetファイルの読み取りに使用されます。fastparquet
: 別のParquetリーダーおよびライター。
方法1:PandasとPyArrowを使用する
これは最も簡単な方法で、中小規模のParquetファイルに適しています。
import pandas as pd # Parquetファイルを読み取る df = pd.read_parquet('data.parquet', engine='pyarrow') # DataFrameをJSONに変換してファイルに保存する df.to_json('data.json', orient='records', lines=True)
orient='records'
: JSONファイルの各行は、DataFrameの行に対応します。lines=True
: JSONファイルをライン区切り形式で書き込みます。これは、ストリーミングや大きなファイルに役立ちます。
方法2:大きなファイルをチャンクで処理する
メモリに収まらない可能性のある大きなParquetファイルの場合は、データをチャンクで処理することをお勧めします。
import pyarrow.parquet as pq import json # Parquetファイルを開く parquet_file = pq.ParquetFile('large_data.parquet') # チャンクで処理して書き込む with open('large_data.json', 'w') as json_file: json_file.write('[') # JSON配列の開始 first_chunk = True for batch in parquet_file.iter_batches(batch_size=10000): df_chunk = batch.to_pandas() json_str = df_chunk.to_json(orient='records') json_str = json_str[1:-1] # 周りの角括弧を削除する if not first_chunk: json_file.write(',') else: first_chunk = False json_file.write(json_str) json_file.write(']') # JSON配列の終了
このアプローチでは、Parquetファイルをバッチで読み取り、各バッチをJSONに変換して、出力ファイルに段階的に書き込むことで、メモリの使用量を効率的に管理します。
方法3:特定の列を変換する
Parquetファイルから特定の列のみが必要な場合は、読み取り操作中にそれらを指定できます。
import pandas as pd # Parquetファイルから特定の列を読み取る df = pd.read_parquet('data.parquet', columns=['column1', 'column2']) # JSONに変換する df.to_json('selected_columns.json', orient='records', lines=True)
この方法では、必要なデータのみをロードすることで、メモリの使用量と処理時間を削減します。
方法4:FastParquetを使用する
fastparquet
は、Parquetファイルを読み取るためのpyarrow
の代替手段であり、特定のシナリオでパフォーマンス上の利点を提供する可能性があります。
import pandas as pd # fastparquetを使用してParquetファイルを読み取る df = pd.read_parquet('data.parquet', engine='fastparquet') # JSONに変換する df.to_json('data_fastparquet.json', orient='records', lines=True)
パフォーマンスと互換性の要件に最適なエンジンを選択してください。
方法5:DuckDBを使用する
DuckDBは、Parquetファイルを効率的に処理できるインプロセスSQL OLAPデータベース管理システムです。
import duckdb # DuckDBを使用してParquetをJSONに変換する duckdb.sql(""" COPY (SELECT * FROM 'data.parquet') TO 'data.json' (FORMAT 'json') """)
この方法は、変換プロセス中の複雑なクエリや変換に特に役立ちます。
ヒントとベストプラクティス
- ネストされたデータの処理: Parquetファイルには、ネストされたデータ構造を含めることができます。JSON出力が目的の構造を維持していることを確認してください。ネストされたフィールドを適宜処理する必要がある場合があります。
- データ型: ParquetとJSON間のデータ型変換に注意してください。一部の型には直接的な対応するものがない可能性があり、カスタム処理が必要になる場合があります。
- パフォーマンス: 非常に大きなデータセットの場合は、メモリの問題を防ぐために、チャンク処理またはビッグデータ用に最適化されたツールの使用を検討してください。
結論
PythonでのParquetファイルからJSONへの変換は、さまざまな方法で実現でき、それぞれが異なるシナリオと要件に適しています。小規模なファイルでも大規模なデータセットでも、Pythonの豊富なエコシステムは、効率的かつ効果的なデータ変換に必要なツールを提供します。
ファイルサイズ、パフォーマンス、データの複雑さなどの要素を考慮して、特定のニーズに合った方法を選択してください。
FAQs
PandasとPyArrow、およびto_json()
を使用して、迅速な変換を行います。
Parquetファイルをバッチで読み取って処理し、メモリ使用量を管理します。
はい、Pandasのcolumns
パラメーターを使用して、必要な列のみをロードします。
We are Leapcell, your top choice for hosting backend projects.
Leapcell is the Next-Gen Serverless Platform for Web Hosting, Async Tasks, and Redis:
Multi-Language Support
- Develop with Node.js, Python, Go, or Rust.
Deploy unlimited projects for free
- pay only for usage — no requests, no charges.
Unbeatable Cost Efficiency
- Pay-as-you-go with no idle charges.
- Example: $25 supports 6.94M requests at a 60ms average response time.
Streamlined Developer Experience
- Intuitive UI for effortless setup.
- Fully automated CI/CD pipelines and GitOps integration.
- Real-time metrics and logging for actionable insights.
Effortless Scalability and High Performance
- Auto-scaling to handle high concurrency with ease.
- Zero operational overhead — just focus on building.
Explore more in the Documentation!
Follow us on X: @LeapcellHQ