web-dev-qa-db-fra.com

Comment convertir un tableau [Row] en DataFrame

Comment est-ce que je convertis cette ligne en un dataframe?

val oneRowDF = myDF.first // gives Array[Row]

Merci

4
Garipaso

Dans ma réponse, df1 est un DataFrame [texte: chaîne, y: int], juste pour tester - val df1 = sc.parallelize(List("a", 1")).toDF("text", "y").

val schema = StructType(
    StructField("text", StringType, false) ::
    StructField("y", IntegerType, false) :: Nil)
val arr = df1.head(3); // Array[Row]
val dfFromArray = sqlContext.createDataFrame(sparkContext.parallelize(arr), schema);

Vous pouvez également mapper un tableau parallélisé et lancer chaque ligne:

val dfFromArray = sparkContext.parallelize(arr).map(row => (row.getString(0), row.getInt(1)))
    .toDF("text", "y");

Dans le cas d'une ligne, vous pouvez exécuter:

val dfFromArray = sparkContext.parallelize(Seq(row)).map(row => (row.getString(0), row.getInt(1)))
    .toDF("text", "y");

Dans Spark 2.0, utilisez SparkSession au lieu de SQLContext.

5
T. Gawęda

Vous ne voulez pas faire ça:

Si vous voulez une sous-partie de la totalité du dataFrame, utilisez simplement limit api.

Exemple:

scala> val d=sc.parallelize(Seq((1,3),(2,4))).toDF
d: org.Apache.spark.sql.DataFrame = [_1: int, _2: int]

scala> d.show
+---+---+
| _1| _2|
+---+---+
|  1|  3|
|  2|  4|
+---+---+


scala> d.limit(1)
res1: org.Apache.spark.sql.Dataset[org.Apache.spark.sql.Row] = [_1: int, _2: int]

scala> d.limit(1).show
+---+---+
| _1| _2|
+---+---+
|  1|  3|
+---+---+

Néanmoins, si vous voulez convertir explicitement un Array [Row] en DataFrame, vous pouvez faire quelque chose comme: 

scala> val value=d.take(1)
value: Array[org.Apache.spark.sql.Row] = Array([1,3])

scala> val asTuple=value.map(a=>(a.getInt(0),a.getInt(1)))
asTuple: Array[(Int, Int)] = Array((1,3))

scala> sc.parallelize(asTuple).toDF
res6: org.Apache.spark.sql.DataFrame = [_1: int, _2: int]

Et donc maintenant vous pouvez le montrer en conséquence!

2
Shiv4nsh

Jetez un coup d'œil à les scaladocs - Je recommanderais RDD[Row] ici, ce qui signifie que vous devez vous y rendre. Devrait être plus facile avec makeRDD . Vous aurez également besoin d'un schéma correspondant à votre Row, que vous pouvez en extraire directement .

... comment avez-vous obtenu Array[Row] en premier lieu?

0
Reactormonk

Si vous avez List<Row>, vous pouvez directement l'utiliser pour créer une dataframe ou dataset<Row> à l'aide de spark.createDataFrame(List<Row> rows, StructType schema). Où spark est SparkSession dans spark 2.x 

0
Arun Y