我需要最终从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) {
^
我做错什么了?或者我还没接近?
1条答案
按热度按时间ego6inou1#
没有常用的方法
for-loop
在斯卡拉。For loop
有Unit
返回类型,并在代码中返回sList
将List[Unit]
:但你宣称
sList
作为List[StructField]
这就是编译错误的原因。我想你应该用
map
函数而不是for loop
用于迭代metadata_class
对象和创建StructFields
从他们那里:你会赚的
List[StructField]
这样。在scala语言中,每条语句都是返回类型的表达式,
for-loop
而且它的返回类型是Unit
.阅读有关语句/表达式的更多信息:
scala中的语句与表达式
scala中的语句和表达式