多くはデータそのものに依存します。一般にSparkは、スプリット可能なファイルではなく大きなファイルを読み込む必要があるときに特に優れたパフォーマンスを発揮します。それにもかかわらず、binaryFiles
メソッドを使用して、標準のPythonツールと組み合わせることができます。ダミーデータで始めることができます:
import tempfile
import pandas as pd
import numpy as np
outdir = tempfile.mkdtemp()
for i in range(5):
pd.DataFrame(
np.random.randn(10, 2), columns=['foo', 'bar']
).to_pickle(tempfile.mkstemp(dir=outdir)[1])
次はbianryFiles
方法使用してそれを読むことができます:
rdd = sc.binaryFiles(outdir)
をし、個々のオブジェクトをデシリアライズ:
import pickle
from io import BytesIO
dfs = rdd.values().map(lambda p: pickle.load(BytesIO(p)))
dfs.first()[:3]
## foo bar
## 0 -0.162584 -2.179106
## 1 0.269399 -0.433037
## 2 -0.295244 0.119195
一つの重要な注意事項は、それが一般的に必要とすることですtextFile
のような単純な方法よりも大幅に多くのメモリを必要とします。
もう1つの方法は、パスのみを並列化し、hdfs3のような分散ファイルシステムから直接読み取れるライブラリを使用することです。これは、通常、著しく悪化したデータローカリティを犠牲にして、より低いメモリ要件を意味する。
これらの2つの事実を考慮すると、通常、データをより細かく読み込むことができる形式でシリアル化する方が良いです。
注:
SparkContext
はpickleFile
方法を提供しますが、名前は誤解を招くことができます。それは普通のPythonのピクルスではなく、pickleオブジェクトを含むSequenceFiles
を読むのに使うことができます。
素晴らしい!ありがとう@ zero323。私の信念を確認する... –