Scala 从数据框创建StructFields列表

Scala 从数据框创建StructFields列表,scala,apache-spark,Scala,Apache Spark,我需要最终从CSV构建一个模式。我可以将CSV读入数据帧,并且定义了一个case类 case class metadata_class (colname:String,datatype:String,length:Option[Int],precision:Option[int]) val foo = spark.read.format("csv").option("delimiter",",").option("header

我需要最终从CSV构建一个模式。我可以将CSV读入数据帧,并且定义了一个case类

case class metadata_class (colname:String,datatype:String,length:Option[Int],precision:Option[int])
val foo = spark.read.format("csv").option("delimiter",",").option("header","true").schema(Encoders.product[metadata_class.schema).load("/path/to/file").as[metadata_file].toDF()
现在,我尝试遍历该数据帧并构建一个StructFields列表。我目前的努力:

val sList: List[StructField] = List(
  for (m <- foo.as[metadata_class].collect) {
    StructField[m.colname,getType(m.datatype))
})
val sList:List[StructField]=List(

对于(m在scala中通常不使用
for loop
for loop
具有
单位
返回类型,并且在您的代码中,
sList
的结果值将是
列表[单位]

val sList: List[Unit] = List(
  for (m <- foo.as[metadata_class].collect) {
    StructField(m.colname, getType(m.datatype))
  }
)
您将通过这种方式获得
List[StructField]

在scala语言中,每条语句都是带有返回类型的表达式,
for循环
,并且它的返回类型是
Unit

阅读有关语句/表达式的更多信息:

val sList: List[Unit] = List(
  for (m <- foo.as[metadata_class].collect) {
    StructField(m.colname, getType(m.datatype))
  }
)
val structFields: List[StructField] = foo.as[metadata_class]
  .collect
  .map(m => StructField(m.colname, getType(m.datatype)))
  .toList