【问题标题】:finding min/max with pyspark in single pass over data使用 pyspark 在单次遍历数据中查找最小值/最大值
【发布时间】:2016-04-11 21:43:27
【问题描述】:

我有一个包含大量数字列表的 RDD(文件中的行长度),我想知道如何在单次传递数据中获取最小值/最大值。

我知道 Min 和 Max 函数,但这需要两次传递。

【问题讨论】:

    标签: python apache-spark pyspark rdd


    【解决方案1】:

    试试这个:

    >>> from pyspark.statcounter import StatCounter
    >>> 
    >>> rdd = sc.parallelize([9, -1, 0, 99, 0, -10])
    >>> stats = rdd.aggregate(StatCounter(), StatCounter.merge, StatCounter.mergeStats)
    >>> stats.minValue, stats.maxValue
    (-10.0, 99.0)
    

    【讨论】:

      【解决方案2】:

      这是一个使用累加器的有效但不优雅的解决方案。不优雅之处在于您必须事先定义零/初始值,以免它们干扰数据:

      from pyspark.accumulators import AccumulatorParam
      class MinMaxAccumulatorParam(AccumulatorParam): 
          def zero(self, value): 
              return value
          def addInPlace(self, val1, val2): 
              return(min(val1[0],val2[0]), max(val1[1],val2[1]))
      
      minmaxAccu = sc.accumulator([500,-500], MinMaxAccumulatorParam())
      
      def g(x):
          global minmaxAccu
          minmaxAccu += (x,x)
      
      rdd = sc.parallelize([1, 2, 3, 4, 5])
      
      rdd.foreach(g)
      
      In [149]: minmaxAccu.value
      Out[149]: (1, 5)
      

      【讨论】:

        猜你喜欢
        • 2019-05-15
        • 2019-04-22
        • 1970-01-01
        • 1970-01-01
        • 2013-11-12
        • 2020-04-02
        • 2018-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多