wake-up-neo.net

Wie kann ich DataFrame aus Scalas Iterables-Liste erstellen?

Ich habe den folgenden Scala-Wert:

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

und ich möchte es in einen DataFrame konvertieren.

Wenn ich folgendes probiere:

sqlContext.createDataFrame(values)

Ich habe diesen Fehler erhalten:

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?

27
MTT

Wie zero323 erwähnt, müssen wir zuerst List[Iterable[Any]] in List[Row] konvertieren, dann Zeilen in RDD setzen und ein Schema für den Funken-Datenrahmen vorbereiten.

Um List[Iterable[Any]] in List[Row] zu konvertieren, können wir sagen

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

und dann ein Schema wie schema haben, können wir RDD machen

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

und schließlich einen Funken-Datenrahmen erstellen

val df = sqlContext.createDataFrame(rdd, schema)
22
MTT

Das ist, wofür Funke Objekt impliziert. Sie können damit Ihre gängigen Scala-Auflistungstypen in DataFrame/DataSet/RDD konvertieren. Hier ist ein Beispiel mit Spark 2.0, es existiert jedoch auch in älteren Versionen

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: Ich habe gerade festgestellt, dass Sie hinter der 2d-Liste stehen. Hier habe ich etwas an Spark-Shell ausprobiert. Ich habe eine 2d-Liste in eine Liste von Tupeln konvertiert und die implizite Konvertierung in DataFrame verwendet: 

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 man Funken-Datenrahmen aus einer Scala-Liste für eine 2d-Liste erstellt, für die dies eine korrekte Antwort ist. Die ursprüngliche Frage lautet https://stackoverflow.com/revisions/38063195/1 .__ Die Frage wurde später geändert, um einer akzeptierten Antwort zu entsprechen. Hinzufügen dieses Editors, so dass jemand, der nach etwas Ähnlichem wie die ursprüngliche Frage sucht, es finden kann. 

31
sparker

Einfachster Ansatz:

val newList = yourList.map(Tuple1(_))
val df = spark.createDataFrame(newList).toDF("stuff")
6
Josh Cason

In Spark 2 können wir DataSet verwenden, indem wir die Liste einfach per toDS-API in DS konvertieren

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

oder

val ds = list.toDS()

Dies ist bequemer als rdd oder df

1
Nitin

Der prägnanteste Weg, den ich gefunden habe:

val df = spark.createDataFrame(List("A", "B", "C").map(Tuple1(_)))
0