如何在reduce表达式中使用.unionAll()来创建单个数据帧

时间:2016-07-07 20:46:37

标签: python apache-spark dataframe pyspark apache-spark-sql

我正在尝试学习使用像reduce这样的函数式编程结构,并且我试图了解如何将它一起用于union多个dataframes。我能用一个简单的for循环完成它。您可以看到注释掉expr这是我的尝试,我遇到的问题是reducePython函数的事实,所以我正在交错{{1和Python代码在同一个函数中,这不会使编译器满意。

这是我的代码:

Spark

1 个答案:

答案 0 :(得分: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的最佳选择。