4
膨大な数のリスト(ファイルからの行の長さ)を持つRDDを持っています。データのシングルパスで最小/最大を取得する方法を知りたいと思います。データ上で単一パスでpysparkを使用して最小/最大を見つける
私はMinとMax機能について知っていますが、それには2回のパスが必要です。
膨大な数のリスト(ファイルからの行の長さ)を持つRDDを持っています。データのシングルパスで最小/最大を取得する方法を知りたいと思います。データ上で単一パスでpysparkを使用して最小/最大を見つける
私はMinとMax機能について知っていますが、それには2回のパスが必要です。
はこれを試してみてください:
>>> 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)
ここでアキュムレータを使用して作業し、まだ洗練ソリューションです。ゼロ/初期値を事前に定義して、データを妨害しないようにする必要があるという点で、不自然さがあります。
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)