微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在python 3.5.2中,如何优雅地链接对象上未知数量的函数而不是更改类型?

如何解决在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 举报,一经查实,本站将立刻删除。