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
中的r
和DataFrame
中的r
有什么区别,为什么r.getAs
只适用于DataFrame
?
在 Whosebug 上做了一些研究后,我在这里找到了一个有用的答案
希望对您有所帮助
Dataset
有一个类型参数:class Dataset[T]
。 T
是数据集中每条记录的类型。 T
可能是任何东西(好吧,任何你可以提供隐式 Encoder[T]
的东西,但这不是重点)。
对 Dataset
的 map
操作将提供的函数应用于每个记录,因此您显示的地图操作中的 r
将具有类型 T
。
最后,DataFrame
实际上只是Dataset[Row]
的别名,也就是说每条记录的类型都是Row
。 Row
有一个名为 getAs
的方法,它接受一个类型参数和一个字符串参数,因此您可以在任何 Row
上调用 getAs[String]("field")
。对于任何没有此方法的 T
- 这将无法编译。
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
?
在 Whosebug 上做了一些研究后,我在这里找到了一个有用的答案
希望对您有所帮助
Dataset
有一个类型参数:class Dataset[T]
。 T
是数据集中每条记录的类型。 T
可能是任何东西(好吧,任何你可以提供隐式 Encoder[T]
的东西,但这不是重点)。
对 Dataset
的 map
操作将提供的函数应用于每个记录,因此您显示的地图操作中的 r
将具有类型 T
。
最后,DataFrame
实际上只是Dataset[Row]
的别名,也就是说每条记录的类型都是Row
。 Row
有一个名为 getAs
的方法,它接受一个类型参数和一个字符串参数,因此您可以在任何 Row
上调用 getAs[String]("field")
。对于任何没有此方法的 T
- 这将无法编译。