2016-07-07 7 views
0

reduceのような関数型プログラミング構造を使用する方法を学び、union複数のdataframesを一緒に使用する方法を試しています。私は単純なforループでそれを達成することができました。あなたは私の試みだったexprをコメントアウトして見ることができます。私が遭遇している問題は、reducePythonの機能なので、同じ機能でPythonSparkコードをインターリーブしています。コンパイラは幸せ。ここでreduce式で.unionAll()を使用して単一のデータフレームを作成する方法

が私のコードです:

df1 = sqlContext.createDataFrame(
     [ 
      ('1', '2', '3'), 
     ], 
     ['a', 'b', 'c'] 
    ) 

df2 = sqlContext.createDataFrame(
    [ 
     ('4', '5', '6'), 
    ], 
    ['a', 'b', 'c'] 
) 

df3 = sqlContext.createDataFrame(
    [ 
     ('7', '8', '9'), 
    ], 
    ['a', 'b', 'c'] 
) 

l = [df2, df3] 

# expr = reduce(lambda acc, b: acc.unionAll(b), l, '') 
for df in l: 
    df1 = df1.unionAll(df) 

df1.select('*').show() 

答えて

1

あなたは

''.unionAll(b) 

を呼び出し、意味がありません明白である状況につながる何reduceに対して誤った初期値を提供します。 initialをドロップし、次のいずれか

reduce(lambda acc, b: acc.unionAll(b), l) if l else None 

または有効なスキーマでDataFrame''を置き換える:

first, *rest = l 
reduce(lambda acc, b: acc.unionAll(b), rest, first) 

はまた、ラムダ式のための必要はありません。

from pyspark.sql import DataFrame 

reduce(DataFrame.unionAll, rest, first) 

あなたがしている場合猿のパッチでさえも冒険気分DataFrame

DataFrame.__add__ = DataFrame.unionAll 
sum(rest, first) 

リネージを切り捨てることなく反復的な組合はSparkのベスト・アイデアではありません。

関連する問題