2015-08-21 10 views

risposta

1

dispiace, è stata colpa mia, ho già trovato la funzione withColumn(String colName, Column col) che dovrebbe risolvere il mio problema

+0

L'unico problema con withColumn è che sarà difficile raccogliere gli elementi dal tuo elenco in sequenza e aggiungerli alle righe selezionate. Se hai un modo per farlo, probabilmente è meglio così, ma la tua domanda è generica da dire;) – Niemand

+0

Perché, prima convertirò la mia lista in oggetto Colonna e la aggiungerò come secondo argomento di funzione. Non va bene? ... – Guforu

+0

Interessante. Per favore pubblica come hai fatto dopo aver finito. – Niemand

5

Probabilmente si dovrebbe convertire il vostro elenco per un singolo RDD colonna e applicare unirsi su critetia pickeg da voi. conversione dataframe Semplice:

val df1 = sparkContext.makeRDD(yourList).toDF("newColumn") 

Se avete bisogno di creare ulteriore colonna di effettuare unirsi in poi è possibile aggiungere più colonne, la mappatura l'elenco:

val df1 = sparkContext.makeRDD(yourList).map(i => (i, fun(i)).toDF("newColumn", "joinOnThisColumn") 

non ho familiarità con la versione di Java, ma si dovrebbe prova a utilizzare JavaSparkContext.parallelize(yourList) e applica operazioni di mapping simili basate su this doc.

+0

ok, grazie, proverò la soluzione. Tuttavia ho trovato anche qualche funzione in API Java, non in Scala. Grazie mille. – Guforu

1

Questo thread è un po 'vecchio, ma mi sono imbattuto in una situazione simile utilizzando Java. Penso più di ogni altra cosa, c'è stato un equivoco concettuale su come dovrei affrontare questo problema.

Per risolvere il problema, ho creato un semplice POJO per assistere con la nuova colonna per un set di dati (anziché provare a creare uno esistente). Penso concettualmente, non ho capito che era meglio generare il set di dati durante la lettura iniziale in cui era necessario aggiungere la colonna aggiuntiva. Spero che questo aiuti qualcuno in futuro.

Si consideri il seguente:

 JavaRDD<MyPojo> myRdd = dao.getSession().read().jdbc("jdbcurl","mytable",someObject.getProperties()).javaRDD().map(new Function<Row,MyPojo>() { 

         private static final long serialVersionUID = 1L; 

         @Override 
         public MyPojo call(Row row) throws Exception { 
         Integer curDos = calculateStuff(row); //manipulate my data 

         MyPojo pojoInst = new MyPojo(); 

         pojoInst.setBaseValue(row.getAs("BASE_VALUE_COLUMN")); 
         pojoInst.setKey(row.getAs("KEY_COLUMN")); 
         pojoInst.setCalculatedValue(curDos); 

         return dos; 
         } 
        }); 

     Dataset<Row> myRddRFF = dao.getSession().createDataFrame(myRdd, MyPojo.class); 

//continue load or other operation here... 
1

Ecco un esempio dove abbiamo avuto una data colonna e voluto aggiungere un'altra colonna con il mese.

Dataset<Row> newData = data.withColumn("month", month((unix_timestamp(col("date"), "MM/dd/yyyy")).cast("timestamp"))); 

Sperando che questo aiuti!

Cheers!