2015-08-26 22 views
5

Ho un'applicazione CLI per la trasformazione di JSON. La maggior parte del codice è map ping, flatMap ping e attraversa con for elenchi di valori J. Ora voglio portare questa applicazione a Spark, ma sembra che ho bisogno di riscrivere tutte le funzioni 1: 1, ma scrivere RDD[JValue] anziché List[JValue].Treat Spark RDD come plain Seq

Esiste un modo (come la classe del tipo) per la funzione di accettare elenchi e RDD.

+2

La firma del metodo della mappa su Elenco e su RDD non è la stessa, quindi questo sarà un problema. Potresti essere in grado di seguire un approccio tipico e definire il tuo wrapper per la loro mappa, fornendo un'istanza per entrambi. Se potessi definire le istanze di scalaz monad e traverse per RDD potresti essere in grado di usarle. – Daenyth

+0

Penso che non ci dovrebbero essere problemi con il functor. Ma a prima vista RDD non regge le leggi Monad. – chuwy

+1

Se RDD non obbedisce alle leggi monade, non sarà possibile FlatMap con la classe di caratteri scalaz. Detto questo potresti essere in grado di implementare una versione che non obbedisce alle leggi e potrebbe * funzionare * per le tue esigenze specifiche. Simile a fornire ValidationFlatMap – Daenyth

risposta

2

Se si desidera condividere il codice per l'elaborazione & codice astratto è possibile spostare il lambda/funzioni anaonymous locali che si passa a map/flatMap in funzioni nome e il riutilizzo loro.

Se si vuole riutilizzare la logica per come ordinare le mappe/flatMaps/etc, si potrebbe anche creare un implicito conversioni tra due RDD e Seq ad un tratto personalizzato che ha solo le funzioni condivise, ma le conversioni implicite possono diventa abbastanza confuso e non penso che questa sia una buona idea (ma tu puoi fare se non sei d'accordo con me :)).

+0

Penso che le conversioni debbano effettivamente coinvolgere le azioni, quindi il RDD verrà calcolato. – chuwy

+0

in effetti, dovresti anche avere un'azione nella tua caratteristica comune perché faccia sempre del lavoro. Penso davvero che il modo giusto per farlo sia tenendo conto della nostra logica condivisa all'interno della mappa/flatMap/etc se questo funziona per te. – Holden

+0

Grazie. Probabilmente sarà la mia scelta se non trovassi qualcosa di più appropriato. Il problema è che le funzioni lambda ora si combinano in quelle più grandi, quindi il factoring out lo renderà un po 'più brutto. Penso anche all'uso di "Either". – chuwy

Problemi correlati