我试图找出Map和ParDo之间的性能差异,但是我无法以某种方式运行ParDo方法
我已经尝试找到一些资源来解决问题,但是我没有找到
ParDo方法(此方法无效):
class ci(beam.DoFn):
def compute_interest(self,data_item):
cust_id, cust_data = data_item
if(cust_data['basic'][0]['acc_opened_date']=='2010-10-10'):
new_data = {}
new_data['new_balance'] = (cust_data['account'][0]['cur_bal'] * cust_data['account'][0]['roi']) / 100
new_data.update(cust_data['account'][0])
new_data.update(cust_data['basic'][0])
del new_data['cur_bal']
return new_data
地图方法(有效)
def compute_interest(data_item):
cust_id, cust_data = data_item
if(cust_data['basic'][0]['acc_opened_date']=='2010-10-10'):
new_data = {}
new_data['new_balance'] = (cust_data['account'][0]['cur_bal'] * cust_data['account'][0]['roi']) / 100
new_data.update(cust_data['account'][0])
new_data.update(cust_data['basic'][0])
del new_data['cur_bal']
return new_data
错误:
提高NotImplementedError RuntimeError:NotImplementedError [在运行“管道名称”时
答案 0 :(得分:3)
Beam.DoFn
期望使用process
方法:
def process(self, element):
如Beam programming guide第4.2.1.2节所述:
在DoFn子类中,您将编写一个方法过程,在其中提供实际的处理逻辑。您无需手动从输入集合中提取元素; Beam SDK会为您解决这个问题。您的处理方法应接受类型为element的对象。这是输入元素,输出是通过使用process方法内的yield或return语句发出的。
作为示例,我们将定义Map
和ParDo
函数:
def compute_interest_map(data_item):
return data_item + 1
class compute_interest_pardo(beam.DoFn):
def process(self, element):
yield element + 2
如果将process
更改为另一个方法名称,则会得到NotImplementedError
。
主管道将是:
events = (p
| 'Create' >> beam.Create([1, 2, 3]) \
| 'Add 1' >> beam.Map(lambda x: compute_interest_map(x)) \
| 'Add 2' >> beam.ParDo(compute_interest_pardo()) \
| 'Print' >> beam.ParDo(log_results()))
输出:
INFO:root:>> Interest: 4
INFO:root:>> Interest: 5
INFO:root:>> Interest: 6