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?
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.
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)
approche la plus Simple:
val newList = yourList.map(Tuple1(_))
val df = spark.createDataFrame(newList).toDF("stuff")
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