2016-02-06 18 views
6

かなり大きなcsvファイル(〜10GB)があり、分析にdaskを利用したいと考えています。しかし、私が読み込むdaskオブジェクトを設定するパーティションの数によっては、私のgroupbyの結果が変わります。私の理解では、daskはコア外処理の利益のためにパーティションを利用しましたが、それでも適切なgroupby出力を返します。これは事実ではないようで、代わりの設定が必要であるかどうかを調べるのには苦労しています。以下は小さな例です:Dask DataFrame Groupbyパーティション

df = pd.DataFrame({'A': np.arange(100), 'B': np.random.randn(100), 'C': np.random.randn(100), 'Grp1': np.repeat([1, 2], 50), 'Grp2': [3, 4, 5, 6], 25)}) 

test_dd1 = dd.from_pandas(df, npartitions=1) 
test_dd2 = dd.from_pandas(df, npartitions=2) 
test_dd5 = dd.from_pandas(df, npartitions=5) 
test_dd10 = dd.from_pandas(df, npartitions=10) 
test_dd100 = dd.from_pandas(df, npartitions=100) 

def test_func(x): 
    x['New_Col'] = len(x[x['B'] > 0.])/len(x['B']) 
    return x 

test_dd1.groupby(['Grp1', 'Grp2']).apply(test_func).compute().head() 
    A    B    C Grp1 Grp2 New_Col 
0 0 -0.561376 -1.422286  1  3  0.48 
1 1 -1.107799 1.075471  1  3  0.48 
2 2 -0.719420 -0.574381  1  3  0.48 
3 3 -1.287547 -0.749218  1  3  0.48 
4 4 0.677617 -0.908667  1  3  0.48 

test_dd2.groupby(['Grp1', 'Grp2']).apply(test_func).compute().head() 
    A    B    C Grp1 Grp2 New_Col 
0 0 -0.561376 -1.422286  1  3  0.48 
1 1 -1.107799 1.075471  1  3  0.48 
2 2 -0.719420 -0.574381  1  3  0.48 
3 3 -1.287547 -0.749218  1  3  0.48 
4 4 0.677617 -0.908667  1  3  0.48 

test_dd5.groupby(['Grp1', 'Grp2']).apply(test_func).compute().head() 
    A    B    C Grp1 Grp2 New_Col 
0 0 -0.561376 -1.422286  1  3  0.45 
1 1 -1.107799 1.075471  1  3  0.45 
2 2 -0.719420 -0.574381  1  3  0.45 
3 3 -1.287547 -0.749218  1  3  0.45 
4 4 0.677617 -0.908667  1  3  0.45 

test_dd10.groupby(['Grp1', 'Grp2']).apply(test_func).compute().head() 
    A    B    C Grp1 Grp2 New_Col 
0 0 -0.561376 -1.422286  1  3  0.5 
1 1 -1.107799 1.075471  1  3  0.5 
2 2 -0.719420 -0.574381  1  3  0.5 
3 3 -1.287547 -0.749218  1  3  0.5 
4 4 0.677617 -0.908667  1  3  0.5 

test_dd100.groupby(['Grp1', 'Grp2']).apply(test_func).compute().head() 
    A    B    C Grp1 Grp2 New_Col 
0 0 -0.561376 -1.422286  1  3  0 
1 1 -1.107799 1.075471  1  3  0 
2 2 -0.719420 -0.574381  1  3  0 
3 3 -1.287547 -0.749218  1  3  0 
4 4 0.677617 -0.908667  1  3  1 

df.groupby(['Grp1', 'Grp2']).apply(test_func).head() 
    A    B    C Grp1 Grp2 New_Col 
0 0 -0.561376 -1.422286  1  3  0.48 
1 1 -1.107799 1.075471  1  3  0.48 
2 2 -0.719420 -0.574381  1  3  0.48 
3 3 -1.287547 -0.749218  1  3  0.48 
4 4 0.677617 -0.908667  1  3  0.48 

groupbyステップは、完全なデータフレームを調べるのではなく、各パーティション内でのみ動作しますか?この場合、npartitions = 1を設定するのは簡単ですし、パフォーマンスに大きな影響はないようですが、read_csvが自動的に特定の数のパーティションを設定するので、groupbyの結果が正確であることを確認するためにどのようにコールを設定しますか?

ありがとうございます!

+0

私の最初の考えは、daskのgroupby/applyは結果の順序を保証しないかもしれないが、それらはすべてとにかく存在するかもしれないということです。 – shoyer

+0

ええ、私もそう思っていましたが、私はさまざまなユニークなスライスを行い、グループ内の結果はパーティション数が増えるにつれて異なっていました。一意の「grp1/grp2」の単一のセットには、例えば2つの異なる値が存在する。 – Bhage

+0

この問題の解決方法はありますか? – codingknob

答えて

2

私はこの結果に驚いています。 Groupby.applyは、パーティションの数に関係なく同じ結果を返さなければなりません。再現可能な例を提供できるなら、私はあなたにraise an issueをお勧めし、開発者の一人が見ていきます。