Eu tenho um grande conjunto de dados que preciso dividir em grupos de acordo com parâmetros específicos. Quero que o trabalho seja processado da maneira mais eficiente possível. Eu posso imaginar duas maneiras de fazer isso
Opção 1 - Criar mapa a partir do RDD original e filtrar
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()
Opção 2 - Filtrar o RDD original diretamente
def customFilter(record):
return passesSomeTest(record)
rdd0 = rddIn.filter(lambda x: customFilter(x)==False).cache()
rdd1 = rddIn.filter(customFilter).cache()
O método fist precisa iterar todos os registros do conjunto de dados original três vezes, onde o segundo apenas o faz duas vezes, em circunstâncias normais, no entanto, a faísca gera alguns gráficos nos bastidores, para que eu possa imaginar que eles são efetivamente feito da mesma maneira. Minhas perguntas são: a.) Um método é mais eficiente que o outro, ou a construção do gráfico de faísca os torna equivalentes? B) É possível fazer essa divisão em uma única passagem?