2

permet de supposer que je crée un fichier parquet comme suit:Lire parquet en jeu de données d'étincelles en ignorant les champs manquants

case class A (i:Int,j:Double,s:String) 

var l1 = List(A(1,2.0,"s1"),A(2,3.0,"S2")) 

val ds = spark.createDataset(l1) 
ds.write.parquet("/tmp/test.parquet") 

Est-il possible de le lire dans un DataSet d'un type avec un schéma différent, où la seule différence est quelques champs supplémentaires?

Par exemple:

case class B (i:Int,j:Double,s:String,d:Double=1.0) // d is extra and has a default value 

Est-il possible que je puisse faire ce travail? :

val ds2 = spark.read.parquet("/tmp/test.parquet").as[B] 

Répondre

1

Spark, si le schéma de DataSet ne vous pouvez utiliser select avec alias correspond pas au type U désiré, ou pour réorganiser ou renommer au besoin. Cela signifie pour le code suivant au travail:

val ds2 = spark.read.parquet("/tmp/test.parquet").as[B] 

Après modifications doit être fait:

val ds2 = spark.read.parquet("/tmp/test.parquet").withColumn("d", lit(1D)).as[B] 

Ou, si la création de colonne supplémentaire est impossible, suivant peut être fait:

val ds2 = spark.read.parquet("/tmp/test.parquet").map{ 
    case row => B(row.getInt(0), row.getDouble(1), row.getString(2)) 
}