Scala 将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(...) ...

例如,当您在RDD.map中使用对象时,Spark会首先序列化整个ojbect。现在,让我们假设,我已经将RDD定义为该可序列化类的成员。Spark会为RDD做什么,它也会尝试序列化它吗。如果是,怎么做

下面是一个示例代码

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如果它符合你的期望并回答了你提出的问题,你能把它标记为一个答案吗。