2015-08-26 3 views
5

Ich habe eine CLI-Anwendung für die Umwandlung von JSONs. Der meiste Code ist map ping, flatMap ping und traversing mit for Listen von JValues. Jetzt möchte ich diese Anwendung zu Spark portieren, aber scheint, muss ich alle Funktionen 1: 1 neu schreiben, aber RDD[JValue] anstelle von List[JValue] schreiben.Behandle Spark RDD wie einfach Seq

Gibt es eine Möglichkeit (wie Typ Klasse) für die Funktion sowohl Listen und RDDs zu akzeptieren.

+2

Die Methodensignatur von Karte auf Liste und auf RDD sind nicht die gleichen, so wird dies ein Schmerz sein. Möglicherweise können Sie mit einem Typklassenansatz arbeiten und einen eigenen Wrapper für ihre Map definieren, der eine Instanz für beide bereitstellt. Wenn Sie scalaz monad und traverse-Instanzen für RDD definieren könnten, könnten Sie dies möglicherweise verwenden. – Daenyth

+0

Ich denke, es sollte keine Probleme mit Funktor geben. Aber auf den ersten Blick hält RDD keine Monad-Gesetze. – chuwy

+1

Wenn RDD nicht den Monad-Gesetzen gehorcht, können Sie FlatMap nicht mit der Scalaz-Typklasse verwenden. Das heißt, dass Sie in der Lage sein könnten, eine Version zu implementieren, die nicht den Gesetzen entspricht, und * möglicherweise * für Ihre speziellen Anforderungen funktioniert. Ähnlich wie bei der Bereitstellung von ValidationFlatMap – Daenyth

Antwort

2

Wenn Sie möchten, für die Verarbeitung von lokalen & abstrakten Code Code teilen Sie Ihre lambdas/anaonymous Funktionen bewegen können, die Sie in zu map/flatMap in benannte Funktionen übergeben und wieder verwenden sie.

Wenn Sie möchten Ihre Logik für wiederverwenden, wie die Karten/flatMaps bestellen/etc, man könnte auch eine implizite Konvertierungen zwischen den beiden RDD und Seq zu einer benutzerdefinierten Eigenschaft, die nur die gemeinsam genutzten Funktionen erstellen, aber implizite Konvertierungen können werden ziemlich verwirrend und ich glaube nicht wirklich, dass dies eine gute Idee ist (aber Sie können es tun, wenn Sie mit mir nicht einverstanden sind :)).

+0

Ich denke, dass Konvertierungen tatsächlich Aktionen beinhalten müssen, also wird RDD berechnet. – chuwy

+0

in der Tat, Sie müssten auch eine Aktion in Ihrem gemeinsamen Merkmal haben, damit es jemals etwas Arbeit erledigen kann. Ich denke wirklich, dass der richtige Weg dies zu tun ist, indem wir unsere gemeinsame Logik in der map/flatMap/etc berücksichtigen, wenn das für dich funktioniert. – Holden

+0

Danke. Wahrscheinlich wird es meine Wahl sein, wenn ich etwas passenderes nicht finden könnte. Das Problem ist, dass diese Lambda-Funktionen jetzt zu größeren zusammengefasst werden, so dass das Aussperren etwas hässlich wird. Ich denke auch über die Verwendung von "Entweder" nach. – chuwy