在Spark2.0中,我可以毫无问题地使用Dataframe.map(r => r.getAs[String]("field"))
但是DataSet.map(r => r.getAs[String]("field"))
给出了错误,r
没有"getAs"方法。
DataSet
中的r
和DataFrame
中的r
有什么区别,为什么r.getAs
仅适用于DataFrame
?
在StackOverflow中做了一些研究之后,我在这里找到了一个有用的答案。
尝试将数据帧行映射到更新的行时出现编码器错误
希望对您有所帮助
Dataset
有一个类型参数:class Dataset[T]
。T
是数据集中每条记录的类型。该T
可能是任何东西(好吧,您可以为其提供隐式Encoder[T]
的任何内容,但这不是重点)。
对Dataset
的map
操作会将提供的函数应用于每条记录,因此您显示的映射操作中的r
将具有T
的类型。
最后,DataFrame
实际上只是Dataset[Row]
的别名,这意味着每条记录的类型都是Row
。Row
有一个名为getAs
的方法,它接受一个类型参数和一个 String 参数,因此你可以在任何Row
上调用getAs[String]("field")
。对于任何没有此方法的T
- 这将无法编译。