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?
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)
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.
Einfachster Ansatz:
val newList = yourList.map(Tuple1(_))
val df = spark.createDataFrame(newList).toDF("stuff")
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
Der prägnanteste Weg, den ich gefunden habe:
val df = spark.createDataFrame(List("A", "B", "C").map(Tuple1(_)))