尝试寻求有关组织广泛的ETL流程的最佳方法的一些指导。我的管道有一个合理的提取段,并以简洁的方式加载到指定的文件中;但我认为执行转换步骤的唯一方法是一系列变量分配:
a = ['some','form','of','petl','data']
b = petl.addfield(a, 'NewStrField', str(a))
c = petl.addrownumbers(b)
d = petl.rename(c, 'row', 'ID')
.......
重新格式化以分配相同的变量名是有道理的,但不利于可读性:
a = ['some','form','of','petl','data']
a = petl.addfield(a, 'NewStrField', str(a))
a = petl.addrownumbers(a)
a = petl.rename(a, 'row', 'ID')
.......
我已经阅读了多个这样的方法调用:
a = ['some','form','of','data']
result = petl.addfield(a, 'NewStrField', str(a))
.addrownumbers(a)
.rename(a, 'row', 'ID')
.......
但这不起作用,因为函数需要将表作为第一个传递的参数。
我缺少一些基本知识吗?我不愿意相信正确的商业方式涉及1000多个LOC?
答案 0 :(得分:0)
创建一个部分应用函数的列表,然后遍历该列表。
transforms = [
lambda x: petl.addfield(x, 'NewStrField', str(x)),
petl.addrownumbers,
lambda x: petl.rename(x, 'row', 'ID')
]
a = ['some', 'form', 'of', 'petl', 'data']
for f in transforms:
a = f(a)
您的“总计”转换是列表transforms
中转换的组成。您可以使用提供功能组合的库或滚动自己的库来预先进行这些操作(以其他一些函数调用为代价)。
def compose(*f):
if not f:
return lambda x: x # Identity function, the identity for function composition
return lambda x: f[0](compose(f[1:])(x))
# Note the reversed order of the functions compared to
# the list above.
transform = compose(
lambda x: petl.rename(x, 'row', 'ID'),
petl.addrownumbers,
lambda x: petl.addfield(x, 'NewStrField', str(x)),
)
a = ['some', 'form', 'of', 'petl', 'data']
result = transform(a)