2015-07-22 3 views
5

Ciao ho un dataframe cui ho bisogno per convertire in JavaRDD e di nuovo a dataframe Ho il seguente codiceSpark dataframe creato da JavaRDD <Row> copia tutti i dati delle colonne in prima colonna

DataFrame sourceFrame = hiveContext.read().format("orc").load("/path/to/orc/file"); 
//I do order by in above sourceFrame and then I convert it into JavaRDD 
JavaRDD<Row> modifiedRDD = sourceFrame.toJavaRDD().map(new Function<Row,Row>({ 
    public Row call(Row row) throws Exception { 
     if(row != null) { 
      //updated row by creating new Row 
      return RowFactory.create(updateRow); 
     } 
     return null; 
}); 
//now I convert above JavaRDD<Row> into DataFrame using the following 
DataFrame modifiedFrame = sqlContext.createDataFrame(modifiedRDD,schema); 

sourceFrame e modifiedFrame schema è lo stesso quando chiamo l'output sourceFrame.show() vedo che ogni colonna ha i valori corrispondenti e nessuna colonna è vuota ma quando chiamo modifiedFrame.show() vedo tutti i valori delle colonne vengono uniti nel valore della prima colonna per es. assumere fonte dataframe ha 3 colonna come mostrato di seguito

_col1 _col2 _col3 
ABC  10  DEF 
GHI  20  JKL 

Quando stampo modifiedFrame che ho convertito da JavaRDD si vede nel seguente ordine

_col1  _col2  _col3 
ABC,10,DEF 
GHI,20,JKL 

Come mostrato soprattutto la _col1 offre tutti i valori e _col2 e _col3 è vuoto. Non so cosa stia facendo, per favore, guida Sono nuovo a Spark grazie in anticipo.

+0

qual è la variabile updateRow esattamente? –

+0

Aggiornare Row convertendo l'oggetto Row nell'elenco di oggetti java collection e quindi aggiornando un valore di campo e quindi restituendo quell'elenco come parte di RowFactory.create – u449355

risposta

8

Come ho accennato nel commento della domanda;

Potrebbe verificarsi a causa della lista come un parametro.

return RowFactory.create(updateRow); 

Se analizzati documenti e codici sorgente di Apache Spark; In quello specifying schema example Assegnano i parametri uno per uno per tutte le colonne, rispettivamente. Basta esaminare il codice sorgente circa la classe RowFactory.java e la classe GenericRow non assegna questo parametro. Quindi prova a dare i parametri rispettivamente per la colonna della riga.

return RowFactory.create(updateRow.get(0),updateRow.get(1),updateRow.get(2)); // List Example 

Si può provare a convertire l'elenco in serie e quindi passare come parametro.

YourObject[] updatedRowArray= new YourObject[updateRow.size()]; 
updateRow.toArray(updatedRowArray); 
return RowFactory.create(updatedRowArray); 

Dal modo in cui il metodo RowFactory.create() sta creando oggetti Riga. In Apache Spark documentation about Row object and RowFactory.create() method;

Rappresenta una riga di output da un operatore relazionale. Consente sia l'accesso generico ordinale, che comporta l'overhead di boxe per le primitive , sia l'accesso primitivo nativo. Non è valido utilizzare l'interfaccia primitiva nativa per recuperare un valore null, , invece un utente deve verificare isNullAt prima di tentare di recuperare un valore che potrebbe essere nullo.

Per creare una nuova riga, utilizzare RowFactory.create() in Java o Row.apply() in Scala .

Un oggetto Riga può essere costruito fornendo valori di campo. Esempio:

importazione org.apache.spark.sql._

// Crea una Linea valori.

Row (valore1, valore2, value3, ...)

// creare una riga da un Seq di valori.

Row.fromSeq (Seq (valore1, valore2, ...))

Secondo la documentazione; È anche possibile applicare il proprio algoritmo richiesto per separare le colonne di righe mentre si creano rispettivamente oggetti Row. Ma penso che convertire la lista in array e passare parametri come una matrice funzionerà per voi (non potrei provare per favore postare i vostri feedback, grazie).

+0

Ciao, grazie per la risposta. In realtà ho 45 campi/colonne per semplicità ho mostrato solo tre colonne. Row Factory.create() accetta un argomento variabile così accetta la lista java farà alcuna differenza se passerò tutti i valori a mano – u449355

+0

Ciao, ho appena migliorato la risposta in relazione alle tue esigenze. –

+0

Ciao grazie ha funzionato convertendo la lista int array. – u449355