Ich habe einen großen Datensatz, den ich nach bestimmten Parametern in Gruppen aufteilen muss. Ich möchte, dass der Job so effizient wie möglich bearbeitet wird. Ich kann mir zwei Möglichkeiten vorstellen, dies zu tun
Option 1 - Karte aus Original-RDD erstellen und filtern
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()
Option 2 - Original-RDD direkt filtern
def customFilter(record):
return passesSomeTest(record)
rdd0 = rddIn.filter(lambda x: customFilter(x)==False).cache()
rdd1 = rddIn.filter(customFilter).cache()
Die Faustmethode muss dreimal über alle Datensätze des Originaldatensatzes iterieren, wobei die zweite Methode dies nur zweimal tun muss. Unter normalen Umständen führt der Funke jedoch einige Grafiken hinter den Kulissen aus, sodass ich mir vorstellen kann, dass dies der Fall ist effektiv auf die gleiche Weise getan. Meine Fragen sind: a.) Ist eine Methode effizienter als die andere oder macht das Erstellen von Funkengraphen sie gleichwertig? B.) Ist es möglich, diese Aufteilung in einem einzigen Durchgang durchzuführen?