为什么Map有效而ParDo不起作用?

时间:2019-06-07 23:07:47

标签: python apache-beam

我试图找出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 [在运行“管道名称”时

1 个答案:

答案 0 :(得分:3)

Beam.DoFn期望使用process方法:

def process(self, element):

Beam programming guide第4.2.1.2节所述:

  

在DoFn子类中,您将编写一个方法过程,在其中提供实际的处理逻辑。您无需手动从输入集合中提取元素; Beam SDK会为您解决这个问题。您的处理方法应接受类型为element的对象。这是输入元素,输出是通过使用process方法内的yield或return语句发出的。

作为示例,我们将定义MapParDo函数:

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

code