在Spark2.0中,我可以毫无问题地使用Dataframe.map(r => r.getAs[String]("field"))
但是DataSet.map(r => r.getAs[String]("field"))
给出的错误是r
没有" getAs"方法
r
中的DataSet
与r
中的DataFrame
以及r.getAs
仅适用于DataFrame
的原因之间的区别是什么?
在StackOverflow中做了一些研究之后,我在这里找到了一个有用的答案
Encoder error while trying to map dataframe row to updated row
希望它有用
答案 0 :(得分:3)
Dataset
有一个类型参数:class Dataset[T]
。 T
是数据集中每条记录的类型。那个T
可能是任何东西(嗯,任何你可以提供隐含Encoder[T]
的东西,但除了这一点之外)。
map
上的Dataset
操作会将提供的函数应用于每条记录,因此您展示的地图操作中的r
将具有T
类型。
最后,DataFrame
实际上只是Dataset[Row]
的别名,这意味着每条记录的类型都为Row
。 Row
有一个名为getAs
的方法,它接受一个类型参数和一个String参数,因此您可以在任何getAs[String]("field")
上调用Row
。对于没有此方法的任何T
- 这将无法编译。