我正在努力学习apache-spark。这是我试图运行的代码。我正在使用pyspark api
。
data = xrange(1, 10000)
xrangeRDD = sc.parallelize(data, 8)
def ten(value):
"""Return whether value is below ten.
Args:
value (int): A number.
Returns:
bool: Whether `value` is less than ten.
"""
if (value < 10):
return True
else:
return False
filtered = xrangeRDD.filter(ten)
print filtered.collect()
print filtered.take(8)
print filtered.collect()
将此值作为输出[1, 2, 3, 4, 5, 6, 7, 8, 9]
。
根据我的理解filtered.take(n)
将从RDD中获取n个元素并将其打印出来。
我正在尝试两种情况: -
1)给出小于或等于RDD中元素数量的n值
2)给出的值大于RDD中元素的数量
我有pyspark application UI
来查看每种情况下运行的作业数量。在第一种情况下,只有one job
正在运行,但第二个five jobs
正在运行。
我无法理解为什么会这样。提前致谢。
答案 0 :(得分:2)
RDD.take
尝试评估尽可能少的分区。
如果你take(9)
它将获取分区0(作业1)找到9个项目并愉快地终止。
如果你take(10)
它将获取分区0(作业1)并找到9个项目。它需要一个。由于分区0有9,它认为分区1可能至少有一个(作业2)。但事实并非如此!在2个分区中,它找到了9个项目。所以到目前为止每个分区4.5个项目。该公式将其除以1.5为悲观,并决定10 /(4.5 / 1.5)= 3个分区将做到这一点。因此它获取分区2(作业3)。依然没有。所以到目前为止每个分区有3个项目除以1.5表示我们需要10 /(3 / 1.5)= 5个分区。它获取分区3和4(作业4)。没有。我们每个分区有1.8个项目,10 /(1.8 / 1.5)= 8.它获取最后3个分区(作业5),就是这样。
此算法的代码位于RDD.scala。正如你所看到的,它只不过是启发式。它通常会节省一些工作,但在退化的情况下会导致不必要的工作。