У меня есть большой набор данных, который мне нужно разделить на группы в соответствии с конкретными параметрами. Я хочу, чтобы работа выполнялась максимально эффективно. Я могу представить два способа сделать это
Вариант 1 - Создать карту из оригинального СДР и отфильтровать
def customMapper(record):
if passesSomeTest(record):
return (1,record)
else:
return (0,record)
mappedRdd = rddIn.map(lambda x: customMapper(x))
rdd0 = mappedRdd.filter(lambda x: x[0]==0).cache()
rdd1 = mappedRdd.filter(lambda x: x[1]==1).cache()
Вариант 2 - Фильтр оригинальной СДР напрямую
def customFilter(record):
return passesSomeTest(record)
rdd0 = rddIn.filter(lambda x: customFilter(x)==False).cache()
rdd1 = rddIn.filter(customFilter).cache()
Первый метод должен перебирать все записи исходного набора данных 3 раза, тогда как второй должен делать это только дважды, но в обычных условиях спарк делает некоторые закулисные построения графика, так что я могу представить, что они эффективно сделано таким же образом. Мои вопросы: а.) Является ли один метод более эффективным, чем другой, или делает построение искрового графа эквивалентным? Б.) Возможно ли сделать это разделение за один проход?