2016-06-27 19 views
20

Ho il seguente valore Scala:Come creare DataFrame dalla lista di Iterables di Scala?

val values: List[Iterable[Any]] = Traces().evaluate(features).toList 

e voglio convertirlo in un dataframe.

Quando provo il seguente:

sqlContext.createDataFrame(values) 

ho ottenuto questo errore:

error: overloaded method value createDataFrame with alternatives: 

[A <: Product](data: Seq[A])(implicit evidence$2: reflect.runtime.universe.TypeTag[A])org.apache.spark.sql.DataFrame 
[A <: Product](rdd: org.apache.spark.rdd.RDD[A])(implicit evidence$1: reflect.runtime.universe.TypeTag[A])org.apache.spark.sql.DataFrame 
cannot be applied to (List[Iterable[Any]]) 
      sqlContext.createDataFrame(values) 

Perché?

+2

'Lista [Iterable [Qualsiasi]]'? Non lo fai. Se i valori possono essere espressi utilizzando i tipi SQL, convertire in 'List [Row]' e fornire lo schema. – zero323

risposta

19

Come zero323 menzionato, dobbiamo prima convertire List[Iterable[Any]] in List[Row] e quindi inserire righe in RDD e preparare lo schema per il frame di dati spark.

Per convertire List[Iterable[Any]]-List[Row], possiamo dire

val rows = values.map{x => Row(x:_*)} 

e poi dover schema come schema, possiamo fare RDD

val rdd = sparkContext.makeRDD[RDD](rows) 

e, infine, creare una cornice di dati scintilla

val df = sqlContext.createDataFrame(rdd, schema) 
+1

Immagino tu intenda 'sparkContext.makeRDD [Row] (rows)'? –

5

In Spark 2 possiamo usare DataSet semplicemente convertendo li st di DS Tods API

val ds = list.flatMap(_.split(",")).toDS() // Records split by comma 

o

val ds = list.toDS() 

Questo più conveniente rispetto rdd o df

+0

toDF() non funziona nell'elenco [Elenco [Qualsiasi]] – Antonin

16

Questo è ciò scintilla impliciti oggetto è per. Permette di convertire i comuni tipi di collezione scala in DataFrame/DataSet/RDD. Ecco un esempio con Spark 2.0 ma esiste in versioni più vecchie troppo

import org.apache.spark.sql.SparkSession 
val values = List(1,2,3,4,5) 

val spark = SparkSession.builder().master("local").getOrCreate() 
import spark.implicits._ 
val df = values.toDF() 

Edit: appena capito che eri dopo lista 2d. Ecco qualcosa che ho provato con la scintilla. Ho convertito una lista 2d alla lista di tuple e utilizzato conversione implicita a dataframe:

val values = List(List("1", "One") ,List("2", "Two") ,List("3", "Three"),List("4","4")).map(x =>(x(0), x(1))) 
import spark.implicits._ 
val df = values.toDF 

Edit2: La domanda originale di MTT era Come creare scintilla dataframe da un elenco scala per una lista 2d per cui questa è una corretta risposta. La domanda originale è https://stackoverflow.com/revisions/38063195/1 La domanda è stata successivamente modificata per corrispondere a una risposta accettata. Aggiungendo questa modifica in modo che se qualcun altro cerca qualcosa di simile alla domanda originale può trovarlo. approccio

5

più semplice:

val newList = yourList.map(Tuple1(_)) 
val df = spark.createDataFrame(newList).toDF("stuff") 
Problemi correlati