Я использую Apache-Beam для запуска некоторых преобразований данных, включая извлечение данных из txt, csv и различных источников данных.Одна вещь, которую я заметил, это разница результатов при использовании beam.Map и beam.ParDo
В следующем примере:
ЯЧтение данных CSV, и в первом случае передать их в DoFn, используя beam.ParDo , который извлекает первый элемент, который является датой, а затем распечатывает его.Во втором случае я непосредственно использую beam.Map , чтобы сделать то же самое, а затем распечатать его.
class Printer(beam.DoFn):
def process(self,data_item):
print data_item
class DateExtractor(beam.DoFn):
def process(self,data_item):
return (str(data_item).split(','))[0]
data_from_source = (p
| 'ReadMyFile 01' >> ReadFromText('./input/data.csv')
| 'Splitter using beam.ParDo 01' >> beam.ParDo(DateExtractor())
| 'Printer the data 01' >> beam.ParDo(Printer())
)
copy_of_the_data = (p
| 'ReadMyFile 02' >> ReadFromText('./input/data.csv')
| 'Splitter using beam.Map 02' >> beam.Map(lambda record: (record.split(','))[0])
| 'Printer the data 02' >> beam.ParDo(Printer())
)
То, что я заметил в двух выходах, следующее:
##With beam.ParDo##
2
0
1
7
-
0
4
-
0
3
2
0
1
7
##With beam.Map##
2017-04-03
2017-04-03
2017-04-10
2017-04-10
2017-04-11
2017-04-12
2017-04-12
Я нахожу это странным.Мне интересно, если проблема в функции печати?Но после использования разных преобразований он показывает одинаковые результаты.Пример выполнения:
| 'Group it 01' >> beam.Map(lambda record: (record, 1))
, который все еще возвращает ту же проблему:
##With beam.ParDo##
('8', 1)
('2', 1)
('0', 1)
('1', 1)
##With beam.Map##
(u'2017-04-08', 1)
(u'2017-04-08', 1)
(u'2017-04-09', 1)
(u'2017-04-09', 1)
Любая идея, в чем причина?Чего мне не хватает в разнице между beam.Map и beam.ParDo ???