2016-07-10 4 views
0

私は約100万行のSparkデータフレームを持っています。私はpysparkを使用しており、データフレームの各列のscipyライブラリからbox-cox変換を適用する必要があります。しかし、box-cox関数は入力として1-d numpy配列しか許さない。これを効率的に行うにはどうすればよいですか?スパークデータフレーム列をNumpy配列に効率的に変換する方法はありますか?

numpyアレイはsparkで配布されていますか、またはドライバプログラムが実行されている単一ノードにすべての要素を収集していますか?

suppose df is my dataframe with column as C1 はその後、私は、Sparkでこの

stats.boxcox(df.select("C1")) 
+0

Spark DataFrameをお持ちで、Numpyを使用して個々の列を処理できるという利点がある場合はほとんどありません。基本的には、あなたのデータは、Pandasに変換することでローカルで処理できるだけの十分な(クリーンな、集約された)データであるか、Numpyだけでは一般的にできることではない分散データで動作する方法が必要です。 – zero323

答えて

0

データフレームは、/ RDDと同様の動作を実行したい処理が分散される方法から抽象化することを可能。

あなたが必要とすることをするために、私はUDFが非常に役に立つと思います。ここでは、その使用例を見ることができます:

Functions from Python packages for udf() of Spark dataframe

+0

返信いただきありがとうございます。 scipyライブラリから以下の関数を適用する必要があります。これは、単一要素ではなく入力としてndarrayだけを受け入れます。 stats.boxcox(x)xは1-d numpyの配列です –

0

私は問題を解決するための回避策を持っていますが、pysparkとパンダデータフレームの間で切り替えているとわからない、性能の点で最適なソリューションです。

dfpd = df.toPandas() 
colName = 'YOUR_COLUMN_NAME' 
colBCT_Name = colName + '_BCT' 
print colBCT_Name 
maxVal = dfpd[colName][dfpd[colName].idxmax()] 
minVal = dfpd[colName][dfpd[colName].idxmin()] 
print maxVal 
print minVal 

col_bct, l = stats.boxcox(dfpd[colName]- minVal +1) 
col_bct = col_bct*l/((maxVal +1)**l-1) 
col_bct =pd.Series(col_bct) 
dfpd[colBCT_Name] = col_bct 
df = sqlContext.createDataFrame(dfpd) 
df.show(2) 
関連する問題