Spark2.0中Dataset.map(r => xx)和Dataframe.map(r => xx)之间的区别是什么?

时间:2017-09-06 18:36:58

标签: scala apache-spark spark-dataframe apache-spark-dataset

在Spark2.0中,我可以毫无问题地使用Dataframe.map(r => r.getAs[String]("field"))

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

r中的DataSetr中的DataFrame以及r.getAs仅适用于DataFrame的原因之间的区别是什么?

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

  

Encoder error while trying to map dataframe row to updated row

希望它有用

1 个答案:

答案 0 :(得分:3)

Dataset有一个类型参数:class Dataset[T]T是数据集中每条记录的类型。那个T可能是任何东西(嗯,任何你可以提供隐含Encoder[T]的东西,但除了这一点之外)。

map上的Dataset操作会将提供的函数应用于每条记录,因此您展示的地图操作中的r将具有T类型。

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