2016-02-16 38 views
8

Sto ancora lottando per comprendere tutta la potenza dei set di dati Spark introdotti di recente.Qual è la differenza tra Spark DataSet e RDD

Esistono best practice su quando utilizzare gli RDD e quando utilizzare i set di dati?

Nei loro announcement Databricks spiega che utilizzando i set di dati è possibile ottenere riduzioni scaglionanti sia in runtime che in memoria. Tuttavia, è stato affermato che i dataset sono progettati per funzionare insieme all'API RDD esistente "".

Si tratta solo di un riferimento alla compatibilità verso il basso o ci sono scenari in cui si preferirebbe utilizzare RDD su Dataset?

+0

controllare questo link anche: https: // StackOverflow.com/a/45253013/1592191 – mrsrinivas

risposta

14

In questo momento (Spark 1.6.0) DataSet API è solo un'anteprima e solo un piccolo sottoinsieme di funzionalità è implementato quindi non è possibile dire nulla sulle migliori pratiche.

Concettualmente Spark DataSet è solo un DataFrame con la sicurezza di tipo aggiuntivo (o se preferite a glance at the futureDataFrame è un DataSet[Row]). Significa che ottieni tutti gli benefits of Catalyst e Tungsten. Include l'ottimizzazione del piano logico e fisico, le operazioni vettorializzate e la gestione della memoria di basso livello.

Ciò che si perde è flessibilità e trasparenza.

Prima di tutto i dati devono essere codificati prima di poter essere utilizzati con DataSet. Spark fornisce codificatori per tipi primitivi e prodotti/classi di casi e per ora non è disponibile l'API richiesta per definire la serializzazione personalizzata. Molto probabilmente sarà relativamente simile all'API UDT (vedi ad esempio How to define schema for custom type in Spark SQL?, Serialize/Deserialize existing class for spark sql dataframe) con tutti i suoi problemi. È relativamente prolisso, richiede uno sforzo supplementare e può diventare tutt'altro che ovvio con oggetti complessi. Inoltre, tocca alcuni aspetti di livello inferiore dell'API che non sono molto ben documentati.

Per quanto riguarda la trasparenza è praticamente lo stesso problema con un pianificatore in un tipico RDBMS. È fantastico finché non lo è. È uno strumento straordinario, in grado di analizzare i tuoi dati, realizzare trasformazioni intelligenti, ma come ogni strumento può prendere una strada sbagliata e lascia il programma esecutivo e cercare di capire come far funzionare le cose.

Sulla base di un'anteprima, direi che può essere posizionato da qualche parte tra l'API DataFrame e l'API RDD. È più flessibile di DataFrames ma offre ancora ottimizzazioni simili e si adatta bene alle attività generali di elaborazione dei dati. Non fornisce la stessa flessibilità (almeno senza un'immersione più profonda negli interni di Catalyst) come API RDD.

Un'altra differenza, che in questo momento è solo ipotetica, è un modo in cui interagisce con i linguaggi guest (R, Python). Simile a DataFrame, DataSet appartiene a JVM. Ciò significa che qualsiasi interazione possibile può appartenere a una delle due categorie: operazione JVM nativa (come le espressioni DataFrame) e codice lato ospite (come UDF Python). Sfortunatamente la seconda parte richiede costosi round-trip tra JVM e un ambiente ospite.

Consulta anche:

+1

Mille grazie per la risposta dettagliata! –