Scala 从数据框创建StructFields列表
我需要最终从CSV构建一个模式。我可以将CSV读入数据帧,并且定义了一个case类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
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