Soy nuevo en Scala. Estoy tratando de convertir un scala lista (que es la celebración de los resultados de algunos datos calculados en una fuente DataFrame) a Dataframe o conjunto de datos. Yo soy de no encontrar ningún método directo para hacer eso.
Sin embargo, he tratado de que el siguiente proceso para convertir mi lista para el conjunto de datos, pero parece que no funciona. Estoy dando los 3 siguientes situaciones.

Puede alguien por favor me proporcione algún rayo de esperanza, de cómo hacer esta conversión? Gracias.

import org.apache.spark.sql.{DataFrame, Row, SQLContext, DataFrameReader}
import java.sql.{Connection, DriverManager, ResultSet, Timestamp}
import scala.collection._

case class TestPerson(name: String, age: Long, salary: Double)
var tom = new TestPerson("Tom Hanks",37,35.5)
var sam = new TestPerson("Sam Smith",40,40.5)

val PersonList = mutable.MutableList[TestPerson]()

//Adding data in list
PersonList += tom
PersonList += sam

//Situation 1: Trying to create dataset from List of objects:- Result:Error
//Throwing error
var personDS = Seq(PersonList).toDS()
/*
ERROR:
error: Unable to find encoder for type stored in a Dataset.  Primitive types
   (Int, String, etc) and Product types (case classes) are supported by     
importing sqlContext.implicits._  Support for serializing other types will  
be added in future releases.
     var personDS = Seq(PersonList).toDS()

*/
//Situation 2: Trying to add data 1-by-1 :- Result: not working as desired.    
the last record overwriting any existing data in the DS
var personDS = Seq(tom).toDS()
personDS = Seq(sam).toDS()

personDS += sam //not working. throwing error


//Situation 3: Working. However, I am having consolidated data in the list    
which I want to convert to DS; if I loop the results of the list in comma  
separated values and then pass that here, it will work but will create an  
extra loop in the code, which I want to avoid.
var personDS = Seq(tom,sam).toDS()
scala> personDS.show()
+---------+---+------+
|     name|age|salary|
+---------+---+------+
|Tom Hanks| 37|  35.5|
|Sam Smith| 40|  40.5|
+---------+---+------+
  • ¿Cuál es su chispa y la scala versión?
  • Spark versión 1.6.1
InformationsquelleAutor Leo | 2016-09-08

1 Comentario

  1. 12

    Probar sin Seq:

    case class TestPerson(name: String, age: Long, salary: Double)
    val tom = TestPerson("Tom Hanks",37,35.5)
    val sam = TestPerson("Sam Smith",40,40.5)
    val PersonList = mutable.MutableList[TestPerson]()
    PersonList += tom
    PersonList += sam
    
    val personDS = PersonList.toDS()
    println(personDS.getClass)
    personDS.show()
    
    val personDF = PersonList.toDF()
    println(personDF.getClass)
    personDF.show()
    personDF.select("name", "age").show()

    De salida:

    class org.apache.spark.sql.Dataset
    
    +---------+---+------+
    |     name|age|salary|
    +---------+---+------+
    |Tom Hanks| 37|  35.5|
    |Sam Smith| 40|  40.5|
    +---------+---+------+
    
    class org.apache.spark.sql.DataFrame
    
    +---------+---+------+
    |     name|age|salary|
    +---------+---+------+
    |Tom Hanks| 37|  35.5|
    |Sam Smith| 40|  40.5|
    +---------+---+------+
    
    +---------+---+
    |     name|age|
    +---------+---+
    |Tom Hanks| 37|
    |Sam Smith| 40|
    +---------+---+

    También, asegúrese de mover la declaración de el caso de la clase TestPerson fuera del ámbito de su objeto.

    • Gracias por la solución anterior, se trabajó en el caso del conjunto de datos. Mi objetivo final es obtener los datos en DataFrame. He utilizado este comando «scala> val RowsDF = sc.paralelizar(personDS).toDF ()», pero recibiendo el error «<console>:51: error: tipo de desajuste; encontrado : org.apache.chispa.sql.Conjunto de datos[TestPerson] se requiere: Seq[?] val RowsDF = sc.paralelizar(personDS).toDF() «
    • Tengo este: scala> val RowsDF = personDS.toDF() RowsDF: org.apache.chispa.sql.DataFrame = [nombre: cadena edad: bigint, sueldo: doble]

Dejar respuesta

Please enter your comment!
Please enter your name here