2016-07-07 32 views
0

我试图学习使用函数编程结构如reduce,并且我正在试图如何使用它来将union多个dataframes一起使用。我能够用一个简单的for循环来完成它。你可以看到注释掉expr这是我的尝试,我遇到的问题是reducePython函数,所以我在交叉PythonSpark代码在相同的功能,这并不使编译器开心。如何在减少表达式中使用.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

为您提供reduce不正确的初始值是什么导致了在那里你打电话

''.unionAll(b) 

,它应该是很明显它没有任何意义上的情况。无论是降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) 

也没有必要对lambda表达式:

from pyspark.sql import DataFrame 

reduce(DataFrame.unionAll, rest, first) 

如果你是冒险心情你还可以猴子补丁DataFrame

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

在侧面说明不带截断谱系的迭代联合不是Spark中最好的想法。

相关问题