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?
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)
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.
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 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
Le moyen le plus concis que j'ai trouvé:
val df = spark.createDataFrame(List("A", "B", "C").map(Tuple1(_)))