2016-03-26 9 views
4

私のデータは、Python 3のピクルスファイルのセットとして利用できます。それらのほとんどはPandas DataFramesのシリアライズです。spark reading python3 pickle in input

Sparkの使用を開始したいのは、1台のコンピュータに搭載できるメモリとCPUが増えたからです。また、分散ストレージにはHDFSを使用します。

初心者として、入力ファイルとしてピクルスファイルを使用する方法を説明した関連情報は見つかりませんでした。

存在しますか?そうでない場合、回避策はありますか?

ありがとうございます

答えて

6

多くはデータそのものに依存します。一般に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つの事実を考慮すると、通常、データをより細かく読み込むことができる形式でシリアル化する方が良いです。

SparkContextpickleFile方法を提供しますが、名前は誤解を招くことができます。それは普通のPythonのピクルスではなく、pickleオブジェクトを含むSequenceFilesを読むのに使うことができます。

+0

素晴らしい!ありがとう@ zero323。私の信念を確認する... –