web-dev-qa-db-fra.com

Comment créer DataFrame à partir de la liste des itérations 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'essaye ce qui suit:

sqlContext.createDataFrame(values)

J'ai eu cette erreur:

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)

Pourquoi?

27
MTT

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

Pour convertir List[Iterable[Any]] en List[Row], nous pouvons dire

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

et ayant un schéma comme schema, nous pouvons faire RDD

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

et enfin créer un cadre de données d'allumage

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

C’est pour quoi l’étincelle implique un objet Il vous permet de convertir vos types de collection Scala courants en DataFrame/DataSet/RDD. Voici un exemple avec Spark 2.0, mais il existe aussi dans les anciennes versions

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 me rendre compte 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 nuplets et 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 initiale posée par MTT était «Comment créer une base de données spark à partir d’une liste scala pour une liste 2D pour laquelle il s’agit d’une réponse correcte. La question initiale est https://stackoverflow.com/revisions/38063195/1 La question a ensuite été modifiée pour correspondre à une réponse acceptée. Ajoutant cette modification de sorte que si quelqu'un d'autre cherche quelque chose de similaire à la question d'origine peut le trouver. 

31
sparker

Approche la plus simple:

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

Dans Spark 2, nous pouvons utiliser DataSet en convertissant simplement list en DS à l’aide de

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

ou

val ds = list.toDS()

C'est plus pratique que rdd ou df

1
Nitin

Le moyen le plus concis que j'ai trouvé:

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