如何解决在python 3.5.2中,如何优雅地链接对象上未知数量的函数而不是更改类型?
简介
我不太确定标题是否清楚。我的母语不是英语,所以如果有人对这篇文章的内容有更好的总结,请编辑!
环境
python 3.5.2
pyspark 2.3.0
上下文
就我而言,我有两个转换。它们是数据框 rdd 上的 map
函数。
然而,与其硬写它们,我想让我可以给我的函数(处理数据转换)X个函数,这些函数将一个一个地应用于数据帧(第一个函数)和/或前一个转换函数的结果。
初步工作
这是之前的状态,不是想要的,硬写的:
df.rdd.map(transfo1) \
.map(transfo2) \
.saveAsNewAPIHadoopFile
我目前所拥有的
def write_to_index(self,transformation_functions: list,dataframe):
// stuff
for transfo in transformation_functions:
dataframe = dataframe.rdd.map(transfo)
dataframe.saveAsNewAPIHadoopFile
然而,这有一个问题:如果第一个转换的返回不是数据帧,它将在循环的第二次迭代中失败,因为结果对象没有 rdd 属性。
可行的解决方案
object_to_process = dataframe.rdd
for transfo in transformation_functions:
object_to_process = object_to_process.map(transfo)
object_to_process.saveAsNewAPIHadoopFile
上面的解决方案似乎有效(至少会抛出任何错误)。但是我想知道是否有更优雅的解决方案或任何内置的python解决方案。
解决方法
您可以使用这种单线:
from functools import reduce
def write_to_index(self,transformation_functions: list,dataframe):
reduce(lambda x,y: x.map(y),transformation_functions,dataframe.rdd).saveAsNewAPIHadoopFile
如果写得很详细,应该与
相同dataframe.rdd.map(transformation_functions[0]) \
.map(transformation_functions[1]) \
.map(...) \
.saveAsNewAPIHadoopFile
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。