Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将scala中的伴生对象转换为Python_Python_Scala_Pyspark - Fatal编程技术网

将scala中的伴生对象转换为Python

将scala中的伴生对象转换为Python,python,scala,pyspark,Python,Scala,Pyspark,我已经将下面的Spark Scala代码翻译成Python版本 package wscalalearning00 import org.apache.spark._ import org.apache.spark.SparkContext._ import org.apache.log4j._ import org.apache.spark.util.StatCounter object wtry001 { def main(args: Array[String]) { Logg

我已经将下面的Spark Scala代码翻译成Python版本

package wscalalearning00
import org.apache.spark._
import org.apache.spark.SparkContext._
import org.apache.log4j._
import org.apache.spark.util.StatCounter

object wtry001 {
 def main(args: Array[String]) {

     Logger.getLogger("org").setLevel(Level.ERROR)
   class BballStatCounter extends Serializable {
          val stats: StatCounter = new StatCounter()
          var missing: Long = 0

          def add(x: Double): BballStatCounter = {
             if (x.isNaN) {
                  missing += 1
                } else {

                stats.merge(x)
                }
                this
              }

  }
 object BballStatCounter extends Serializable {
  def apply(x: Double) = new BballStatCounter().add(x)
}

     // Create a SparkContext using every core of the local machine
    val sc = new SparkContext(new SparkConf().setAppName("Spark Word Count").setMaster("local")) 
    val testData = (1 to 10000).toArray.map(x=>x.toDouble)
    val stats1 = sc.parallelize(testData)
    val stat3 = stats1.map(b=>BballStatCounter(b))
    stat3.foreach(println)        

 }
}
Python版本:

 import math
    import findspark
    findspark.init()
    from pyspark.sql import SparkSession
    from pyspark.statcounter import StatCounter
    class BballStatCounter(object):

        stats = StatCounter()
        missing=0

        @staticmethod
        def add(x):
            print("add")
            if math.isnan(x):
                BballStatCounter.missing += x
            else:
               BballStatCounter.stats.merge(x)
            return BballStatCounter.stats

    conf = SparkConf().setAppName("SparkExampleRDD").setMaster("local")
    sc = SparkContext(conf=conf)
    testData =map(lambda x: float(x),range(0,10000))
    stats1 = sc.parallelize(testData)
    print(stats1)
    stat3 = stats1.map(lambda b: BballStatCounter.add(b))
    stat3.foreach(print)
在执行上述Python代码时,它会打印
(计数:22,平均值:10.5,stdev:6.34428877022,最大值:21.0,最小值:0.0)
,其中Scala代码打印类似于
BballStatCounter的内容$2@7a811dd5
。我认为Scala代码返回的是同一类的实例。如果我的一般方法和/或语法错误,请告诉我。谢谢。

试试这个

class BballStatCounter:

   def __init__(self):
      self.stats = StatCounter()
      self.missing = 0

    @staticmethod
    def add(x):
        stats = StatCounter()
        missing = 0
        if math.isnan(x):
            BballStatCounter.missing += x
        else:
            BballStatCounter.stats.merge(x,stats,missing)


    def merge(other,stats,missing):
       # stats = BballStatCounter.StatCounter()
        #other = BballStatCounter()
        BballStatCounter.stats.merge(other.stats)
        BballStatCounter.missing = +other.missing
        return self
那就做吧

stat3 = stats1.map(lambda b: BballStatCounter.add(b))
stat3.foreach(print)
我可能没有给你正确的代码,因为我对函数的作用了解甚少。只需关注我是如何在函数之间传递变量的--
希望你能找到你的答案。

一个突出的问题是
BballStatCounter.missing=+other。missing
应该是
BballStatCounter.missing+=other。missing
是/应该是一个静态方法-如果不是,它应该首先有一个自参数。如果您发布了一个适当的最小完整可验证示例,其中包括显示所获得结果所需的所有内容,则可能会运行代码并对其进行调试,但由于您没有这样做,您必须自己进行调试。生命太短暂,无法用奇怪的代码进行太多的思维实验。见@barny。根据您的输入,我添加了最少的可验证代码。
StatCounter
有一个预定义的方法,名为
merge()
add()
invoke
merge()
from
StatCounter
。除此之外,方法
add()
是否应该返回类似于
this
的内容。更新了最小的工作代码。在类内创建
stats
与在静态方法内创建
stats
有什么区别?我是Python编程的新手,尝试探索这种语言。所以这个问题突然出现了?