2016-06-27 11 views
20

Ich habe folgenden Scala Wert:Wie erstellt man DataFrame aus Scalas Liste der Iterables?

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

und ich mag es einen Datenrahmen konvertieren.

Wenn ich versuche, die folgenden:

sqlContext.createDataFrame(values) 

ich diesen Fehler habe:

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) 

Warum?

+2

'Liste [Iterable [Alles]]'? Du nicht. Wenn Werte mit SQL-Typen ausgedrückt werden können, konvertieren Sie zu 'List [Row]' und stellen Sie ein Schema bereit. – zero323

Antwort

19

Wie zero323 erwähnt, müssen wir zuerst List[Iterable[Any]]-List[Row] konvertieren und dann Reihen setzen in RDD und bereiten Schema für die Funkendatenrahmen.

konvertieren List[Iterable[Any]]-List[Row] können wir

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

sagen und dann mit Schema wie schema können wir RDD machen

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

und schließlich einen Funken Datenrahmen erstellen

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

Ich denke du machst 'sparkContext.makeRDD [Row] (rows)'? –

5

In Spark 2 können wir DataSet verwenden, indem Sie einfach li konvertieren st DS von Tods API

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

oder

val ds = list.toDS() 

Dieses bequemer als rdd oder df

+0

toDF() funktioniert nicht in Liste [Liste [Beliebig]] – Antonin

16

Das ist, was Funken implicits Objekt ist für. Sie können damit Ihre gebräuchlichen Scala-Collection-Typen in DataFrame/DataSet/RDD konvertieren. Hier ist ein Beispiel von Spark 2.0, aber es existiert in älteren Versionen zu

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: Gerade realisiert man nach 2d Liste waren. Hier ist etwas, was ich auf Spark-Shell versucht habe. I umgewandelt, um eine 2D-Liste zu Liste von Tupeln und verwendet implizite Konvertierung in Datenrahmen:

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: Die ursprüngliche Frage von MTT war wie Funke Datenrahmen von einer scala-Liste für eine 2D-Liste zu erstellen, für die dies eine korrekte Antworten. Die ursprüngliche Frage lautet https://stackoverflow.com/revisions/38063195/1 Die Frage wurde später geändert, um eine akzeptierte Antwort zu entsprechen. Fügen Sie diese Änderung hinzu, damit jemand, der nach etwas ähnlich der ursprünglichen Frage sucht, diese finden kann.

5

Simplest Ansatz:

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