【问题标题】:Does Spark data set method serialize the computation itself?Spark 数据集方法是否序列化计算本身?
【发布时间】:2020-02-11 13:23:02
【问题描述】:

我有一个包含多列的数据集。需要调用一个函数来使用行中可用的数据计算结果。所以我使用了一个带有方法的案例类,并使用它创建了一个数据集。例如,

case class testCase(x: Double, a1: Array[Double], a2: Array[Double]) {
    var someInt = 0
    def myMethod1(): Unit = {...}    // use x, a1 and a2
    def myMethod2(): Unit = {...}    // use x, a1 and a2
    def result(): { return someInt }

它是从main() 调用的

val res = myDS.map(_.result()).toDF("result")

我面临的问题是,虽然代码正常工作,但无论我如何调用,与程序的其他部分不同,上述语句不能同时工作。无论执行者、核心和repartitioning 的数量如何,似乎每次只有一个方法实例有效!

任何关于我应该看什么的提示将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    testCase 案例类不应该是可变的,如果您同时修改对象的状态,您的程序将因此是不确定的。您提供的少量信息看起来有问题的是这个 sn-p

    var someInt = 0
    

    该值可能正在被多个任务同时修改,我很确定您不希望这样。

    你能解释一下你想做什么吗?

    【讨论】:

    • 有很多数据需要使用如图所示的输入字段进行处理,并且没有一行与任何其他行交互(即,任务是令人尴尬的并行)。功能复杂,辅助方法处理提供的数据(如xa1a2)来帮助主方法。希望这可以澄清。
    • someInt 是否被 myMethod1 或 myMethod2 修改?如果是,那就是问题
    • 是的,vars 是通过一种或多种方法更新的。这种情况有办法解决吗? case classes 不能有静态或通用成员。所以我没有看到任何概念问题。
    • 如果你不解释问题很难解决,我可以告诉你的是,你永远不应该在 Scala 的案例类中添加状态
    • 共享对象应该是不可变的,这是一个通用的函数式编程原则
    猜你喜欢
    • 2018-06-07
    • 2019-05-21
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    相关资源
    最近更新 更多