从数据框创建structfields列表

nxowjjhe  于 2021-05-24  发布在  Spark
关注(0)|答案(1)|浏览(341)

我需要最终从csv构建一个模式。我可以将csv读入Dataframe,并且我已经定义了一个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()

现在我尝试遍历该Dataframe并构建一个structfields列表。我目前的努力:

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

这给了我一个类型不匹配:

found  : Unit
required: org.apache.spark.sql.types.StructField
      for (m <- foo.as[metadata_class].collect) {
             ^

我做错什么了?或者我还没接近?

ego6inou

ego6inou1#

没有常用的方法 for-loop 在斯卡拉。 For loopUnit 返回类型,并在代码中返回 sListList[Unit] :

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

但你宣称 sList 作为 List[StructField] 这就是编译错误的原因。
我想你应该用 map 函数而不是 for loop 用于迭代 metadata_class 对象和创建 StructFields 从他们那里:

val structFields: List[StructField] = foo.as[metadata_class]
  .collect
  .map(m => StructField(m.colname, getType(m.datatype)))
  .toList

你会赚的 List[StructField] 这样。
在scala语言中,每条语句都是返回类型的表达式, for-loop 而且它的返回类型是 Unit .
阅读有关语句/表达式的更多信息:
scala中的语句与表达式
scala中的语句和表达式

相关问题