Comment créer DataFrame à partir de la liste des itérables de Scala?

j'ai la valeur Scala suivante:

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

et je veux le convertir en un DataFrame.

Quand j'ai essayer le code suivant:

sqlContext.createDataFrame(values)

j'ai eu cette erreur:

error: overloaded method value createDataFrame with alternatives:

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

Pourquoi?

25
demandé sur Jacek Laskowski 2016-06-28 00:02:35

4 réponses

c'est ce que l'étincelle implicites de l'objet. Il vous permet de convertir vos types communs de collection scala en DataFrame / DataSet / RDD. Voici un exemple avec Spark 2.0 mais il existe aussi dans les versions plus anciennes

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: je viens de réaliser que vous étiez après la liste 2d. Voici quelque chose que j'ai essayé sur spark-shell. J'ai converti une liste 2d en liste de Tuples et j'ai utilisé la conversion implicite en 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 question originale de MTT était comment créer spark dataframe à partir d'un scala liste pour un 2d liste pour qui c'est une réponse correcte. La question d'origine est https://stackoverflow.com/revisions/38063195/1 La question a ensuite été modifiée pour correspondre à une réponse acceptée. Ajouter cette édition de sorte que si quelqu'un d'autre recherche quelque chose de similaire à la question originale peut le trouver.

25
répondu sparker 2017-07-12 10:29:23

zero323 mentionné, nous devons d'abord convertir List[Iterable[Any]]List[Row] et puis mettre des lignes en RDD et préparer le schéma pour le cadre de données spark.

Pour convertir List[Iterable[Any]]List[Row], on peut dire

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

et ensuite avoir le schéma de la forme schema, nous pouvons faire CA

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

et enfin créer un cadre de données spark

val df = sqlContext.createDataFrame(rdd, schema)
20
répondu MTT 2017-05-23 12:10:31

approche la plus Simple:

val newList = yourList.map(Tuple1(_))
val df = spark.createDataFrame(newList).toDF("stuff")
4
répondu Josh Cason 2017-03-09 19:09:34

dans Spark 2 nous pouvons utiliser DataSet en convertissant simplement la liste en DS par L'API toDS

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

ou

val ds = list.toDS()

C'est plus pratique que rdd ou df

1
répondu Nitin 2017-04-23 12:00:53