2016-04-21 16 views
6

Voglio creare un DataFrame da un elenco di stringhe che potrebbe corrispondere allo schema esistente. Ecco il mio codice.Scala Spark: come creare un RDD da un elenco di stringhe e convertirlo in DataFrame

val rowValues = List("ann", "f", "90", "world", "23456") // fails 
    val rowValueTuple = ("ann", "f", "90", "world", "23456") //works 

    val newRow = sqlContext.sparkContext.parallelize(Seq(rowValueTuple)).toDF(df.columns: _*) 

    val newdf = df.unionAll(newRow).show() 

Lo stesso codice non funziona se si utilizza l'elenco di stringhe. Vedo che la differenza è con rowValueTuple a Tuple è stato creato. Poiché le dimensioni dell'elenco rowValues cambiano dinamicamente, non riesco a creare manualmente l'oggetto Tuple*. Come posso fare questo? Cosa mi manca? Come posso appiattire questo elenco per soddisfare il requisito?

Apprezzo il tuo aiuto, per favore.

+0

Il primo ti dà un DF con una colonna e 5 righe. Il secondo ti dà un DF con una singola riga con una singola colonna che contiene una tupla. Cose molto diverse –

risposta

10

DataFrame ha uno schema con un numero fisso di colonne, quindi non sembra naturale creare righe per lista di lunghezza variabile. In ogni caso, puoi creare il tuo DataFrame da RDD [Row] usando lo schema esistente, come questo:

val rdd = sqlContext.sparkContext.parallelize(Seq(rowValues)) 
val rowRdd = rdd.map(v => Row(v: _*)) 
val newRow = sqlContext.createDataFrame(rdd, df.schema) 
+0

Grazie @vitality. Ho provato questo. Ma mancava qualcosa. Sono d'accordo con il tuo punto. Ma voglio eseguire questo per data coppia di dataframe e lista di valori di riga come parametri. Si presume che il numero di colonne di dataframe e lunghezza dei valori di riga sia lo stesso. – NehaM

+3

Solo una nota qui, l'ultima riga deve essere '' 'val newRow = sqlContext.createDataFrame (rowRdd, df.schema)' '' Almeno questo è quello che ha funzionato per me. – Rylan

+3

@Rylan: Che cosa significa 'df' qui? – Dinosaurius

Problemi correlati