在 python 3.5.2 中,如何优雅地将未知数量的函数链接到 object 而不是更改类型?
In python 3.5.2, how to elegantly chain an unknown quantity of functions on an object than changes type?
简介
我不太确定标题是否清楚。我的母语不是英语,所以如果有人对 post 的内容有更好的总结,请编辑!
环境
python 3.5.2
pyspark 2.3.0
上下文
我有一个 spark 数据框。此数据在写入弹性搜索之前会进行转换。
就我而言,我有两个转换。它们是数据帧 rdd 上的 map
函数。
但是,我不想硬写它们,而是想这样我就可以为我的函数(处理数据转换)提供 X 个函数,这些函数将一个一个地应用于数据框(第一个function) and/or 之前转换函数的结果。
初步工作
这是以前的状态,不是想要的,硬写的:
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
然而,这有一个问题:如果第一个转换的 return 不是数据帧,它将在循环的第二次迭代中失败,因为生成的 object 没有rdd 属性.
工作解决方案
object_to_process = dataframe.rdd
for transfo in transformation_functions:
object_to_process = object_to_process.map(transfo)
object_to_process.saveAsNewAPIHadoopFile
上面的解决方案似乎可行(至少会抛出任何错误)。但我想知道是否有更优雅的解决方案或任何 built-in 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
简介
我不太确定标题是否清楚。我的母语不是英语,所以如果有人对 post 的内容有更好的总结,请编辑!
环境
python 3.5.2
pyspark 2.3.0
上下文
我有一个 spark 数据框。此数据在写入弹性搜索之前会进行转换。
就我而言,我有两个转换。它们是数据帧 rdd 上的 map
函数。
但是,我不想硬写它们,而是想这样我就可以为我的函数(处理数据转换)提供 X 个函数,这些函数将一个一个地应用于数据框(第一个function) and/or 之前转换函数的结果。
初步工作
这是以前的状态,不是想要的,硬写的:
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
然而,这有一个问题:如果第一个转换的 return 不是数据帧,它将在循环的第二次迭代中失败,因为生成的 object 没有rdd 属性.
工作解决方案
object_to_process = dataframe.rdd
for transfo in transformation_functions:
object_to_process = object_to_process.map(transfo)
object_to_process.saveAsNewAPIHadoopFile
上面的解决方案似乎可行(至少会抛出任何错误)。但我想知道是否有更优雅的解决方案或任何 built-in 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