2016-06-26 40 views
5

Si supponga di avere un DataFrame con una colonna di stringhe, col1 e una colonna di array, col2. Mi chiedevo che cosa succede dietro le quinte nel funzionamento Spark:Come viene implementato l'idioma Spark select-explode?

df.select('col1', explode('col2'))

Sembra che select prende una sequenza di Column oggetti come input e restituisce una explodeColumn così il match tipi. Ma la colonna restituita da explode('col2') è logicamente di lunghezza diversa da col1, quindi mi chiedevo come select sa "sincronizzarli" quando costruisce il suo output DataFrame. Ho provato a guardare la classe Column per gli indizi ma non ho potuto trovare nulla.

risposta

6

La risposta è semplice: non esiste una struttura dati come Column. Mentre Spark SQL utilizza lo storage colonnare per la memorizzazione nella cache e può sfruttare il layout dei dati per alcune colonne di operazioni di basso livello, sono solo descrizioni di dati e trasformazioni e non contenitori di dati. Quindi semplificare le cose un po 'explode è ancora un altro flatMap su Dataset[Row].

+0

Grazie! la mia domanda era tecnicamente sui frame di dati, ma suppongo che sia lo stesso. Ecco [un esempio di questo] (https://github.com/apache/spark/blob/v2.0.0-rc1/sql/core/src/main/scala/org/apache/spark/sql/Dataset.scala# L1587-L1604) dalla sorgente Dataset.scala. – hillel

+1

'DataFrame' è un' Dataset [Row] '. – zero323