Scala 将RDD放在可序列化类中是否不好?
例如,当您在RDD.map中使用对象时,Spark会首先序列化整个ojbect。现在,让我们假设,我已经将RDD定义为该可序列化类的成员。Spark会为RDD做什么,它也会尝试序列化它吗。如果是,怎么做 下面是一个示例代码Scala 将RDD放在可序列化类中是否不好?,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,例如,当您在RDD.map中使用对象时,Spark会首先序列化整个ojbect。现在,让我们假设,我已经将RDD定义为该可序列化类的成员。Spark会为RDD做什么,它也会尝试序列化它吗。如果是,怎么做 下面是一个示例代码 class SomeClass extends Serializable { var a: String var b: Int var rdd: RDD[...] .... } objectOfSomeClass = new SomeClass(...) ...
class SomeClass extends Serializable {
var a: String
var b: Int
var rdd: RDD[...]
....
}
objectOfSomeClass = new SomeClass(...)
...
someRDD.map(x => someFunc(objectOfSomeClass))
关于:
我只是担心整个类的序列化是否也包括其中RDD的序列化
显示的代码不需要序列化整个对象。因此,到目前为止,您还没有面临任何序列化问题。如果您传递某个类的对象,而不是分别传递a
和b
,那么我相信您将面临序列化问题
在你的评论中,你也提到了
我只是担心它是否会影响性能
这也不会出现在图片中,除非您对RDD执行任何操作。只有在对RDD调用任何操作时,才会对该RDD进行延迟评估。此时它将读取并运行转换。在您的示例中,我并没有看到任何操作,所以它不应该影响应用程序的性能
希望这能澄清你的两个疑问
-阿米特Re:
我只是担心整个类的序列化是否也包括其中RDD的序列化
显示的代码不需要序列化整个对象。因此,到目前为止,您还没有面临任何序列化问题。如果您传递某个类的对象,而不是分别传递a
和b
,那么我相信您将面临序列化问题
在你的评论中,你也提到了
我只是担心它是否会影响性能
这也不会出现在图片中,除非您对RDD执行任何操作。只有在对RDD调用任何操作时,才会对该RDD进行延迟评估。此时它将读取并运行转换。在您的示例中,我并没有看到任何操作,所以它不应该影响应用程序的性能
希望这能澄清你的两个疑问
-Amit它将失败,并告诉您对象是非序列化的,它不是。我一直使用RDD作为成员变量,没有任何问题。我只是担心它是否会影响性能。只要您不尝试在其他RDD中使用RDD,就没有问题。在我的例子中,我只是使用该类的一些其他成员变量,而不是RDD变量。我现在添加了一个示例。它的可能副本将失败,并告诉您该对象是未序列化的,它不是。我一直使用RDD作为成员变量,没有任何问题。我只是担心它是否会影响性能。只要您不尝试在其他RDD中使用RDD,就没有问题。在我的例子中,我只是使用该类的一些其他成员变量,而不是RDD变量。我现在添加了一个示例。OK的可能副本,比如说,若我直接使用某个类的objectOfSomeClass,Spark将如何处理该类中的RDD?好吧,它应该失败。您可以试试并发回。这也将有助于确认我们的理解。@MetallicPrist如果它符合您的期望并回答了您提出的问题,您可以将此标记为一个答案吗。好的,假设我直接使用某个类的objectOfSomeClass,Spark将如何处理该类中的RDD?好的,它应该失败。你能试试并把它寄回去吗?这也将有助于确认我们的理解。@metallicprest如果它符合你的期望并回答了你提出的问题,你能把它标记为一个答案吗。