2

让我们假设我创建了一个木文件,如下所示:读实木复合地板成火花集忽略缺少的字段

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") 

是否有可能将其与不同的模式,其中唯一的区别是读入一个类型的数据集几个额外的领域?

如:

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

有没有办法,我可以使这项工作? :

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

回答

1

火花,如果数据集的架构不匹配所需U类型,可以使用select随着alias或重新安排或重新命名要求。这意味着对于下面的代码工作:

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

以下修改需要做的事情:

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

或者,如果创建附加列是不可能的,那么下面可以做:

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