2015-06-18 19 views
19

Ho appena iniziato con DataFrame ieri e mi piace davvero fino ad ora.Spark DataFrames: registerTempTable vs non

Non capisco una cosa però ... (riferimento all'esempio in "programmazione Specificare lo schema" qui: https://spark.apache.org/docs/latest/sql-programming-guide.html#programmatically-specifying-the-schema)

In questo esempio il dataframe è registrata come una tabella (sto indovinando quello di fornire accesso alle query SQL ..?) ma la stessa identica informazione a cui si accede può essere eseguita anche da peopleDataFrame.select ("nome").

Quindi la domanda è .. Quando si desidera registrare un dataframe come tabella invece di utilizzare solo le funzioni dateframe fornite? Ed è un'opzione più efficiente dell'altra?

risposta

19

Il motivo per utilizzare il metodo registerTempTable(tableName) per un dataframe, è così che, oltre a essere in grado di utilizzare i metodi Spark-fornito di un DataFrame, è anche possibile eseguire query SQL via il metodo sqlContext.sql(sqlQuery), che utilizzano tale dataframe come una tabella SQL. Il parametro tableName specifica il nome della tabella da utilizzare per quel DataFrame nelle query SQL.

val sc: SparkContext = ... 
val hc = new HiveContext(sc) 
val customerDataFrame = myCodeToCreateOrLoadDataFrame() 
customerDataFrame.registerTempTable("cust") 
val query = """SELECT custId, sum(purchaseAmount) FROM cust GROUP BY custId""" 
val salesPerCustomer: DataFrame = hc.sql(query) 
salesPerCustomer.show() 

se utilizzare SQL o dataframe metodi come select e groupBy è probabilmente in gran parte una questione di preferenze. La mia comprensione è che le query SQL vengono tradotte nei piani di esecuzione di Spark.

Nel mio caso, ho scoperto che alcuni tipi di query di aggregazione e finestre di cui avevo bisogno, come il calcolo di un saldo operativo per cliente, erano disponibili nel linguaggio di query SQL Hive, che sospetto sarebbe stato molto difficile da fare in Scintilla.

Se si desidera utilizzare SQL, è molto probabile che si desideri creare un HiveContext anziché un normale SQLContext. Il linguaggio di query Hive supporta una gamma di SQL più ampia rispetto a quella disponibile tramite un semplice SQLContext.

+0

Quindi SQLContext è l'implementazione di spark del motore SQL (parser, optimizer, executor, ecc.), Giusto? Cosa succede quando usi HiveContext? L'esecuzione della query sql viene delegata a Hive? Mi sono imbattuto in una lettura che diceva che una distribuzione hive non è richiesta quando si utilizza HiveContext. Come funzionano allora le cose internamente? –

0

C'è bel punto di riferimento confrontando RDD vs dataframe vs prestazioni SparkSQL:


Spark RDDs vs DataFrames vs SparkSQL

Apparentemente GroupBy con la conta e l'ordinamento dei gruppi era notevolmente più veloce con SparkSQL.

Se si dispone di un lavoro di missione critica, potrebbe essere opportuno implementarlo in entrambi i modi per confrontare il tempo e le prestazioni.

Problemi correlati