Spark2.0中Dataset.map(r=>xx)和Dataframe.map(r=>xx)有什么区别?

What's the difference between Dataset.map(r=>xx) and Dataframe.map(r=>xx) in Spark2.0?

Spark2.0的一些方法,我可以正常使用Dataframe.map(r => r.getAs[String]("field"))

但是 DataSet.map(r => r.getAs[String]("field")) 给出错误 r 没有 "getAs" 方法。

DataSet中的rDataFrame中的r有什么区别,为什么r.getAs只适用于DataFrame

在 Whosebug 上做了一些研究后,我在这里找到了一个有用的答案

希望对您有所帮助

Dataset 有一个类型参数:class Dataset[T]T 是数据集中每条记录的类型。 T 可能是任何东西(好吧,任何你可以提供隐式 Encoder[T] 的东西,但这不是重点)。

Datasetmap 操作将提供的函数应用于每个记录,因此您显示的地图操作中的 r 将具有类型 T

最后,DataFrame实际上只是Dataset[Row]的别名,也就是说每条记录的类型都是RowRow 有一个名为 getAs 的方法,它接受一个类型参数和一个字符串参数,因此您可以在任何 Row 上调用 getAs[String]("field")。对于任何没有此方法的 T - 这将无法编译。