Apache spark 分而治之

Apache spark 分而治之,apache-spark,pyspark,rdd,Apache Spark,Pyspark,Rdd,我正在学习Spark并尝试处理一些巨大的数据集。我不明白为什么我没有看到以下策略(伪)减少阶段完成时间: data=sc.textFile(数据集).cache() 尽管如此: data.count() y=data.map(…).reduce(…) data=data.filter(lambda x:x

我正在学习Spark并尝试处理一些巨大的数据集。我不明白为什么我没有看到以下策略(伪)减少阶段完成时间:

data=sc.textFile(数据集).cache()
尽管如此:
data.count()
y=data.map(…).reduce(…)
data=data.filter(lambda x:x
所以,我们的想法是选择y,以便它在大多数情况下将数据减半。但由于某些原因,似乎每次计数()时都会再次处理所有数据


这是一种反模式吗?我该如何使用Spark?是的,这是一种反模式

map
,与Spark中大多数但并非全部的分布式原语一样,从定义上讲,它几乎是一种分而治之的方法。您获取数据,计算拆分,并在集群上透明地分布单个拆分的计算


试图使用高级API进一步划分这个过程毫无意义。最好的情况下,它不会带来任何好处,最坏的情况下,它会产生多次数据扫描的成本,缓存和溢出。

Spark会在
for
中惰性地进行评估,而在
数据调用上方的
循环中。filter
不会顺序返回数据,而是顺序返回要稍后执行的
Spark
调用。所有这些调用都会聚合起来,然后在以后执行某项操作时同时执行

特别是,在调用Spark操作之前,结果仍然未被评估,仅表示结果。超过某一点时,应用程序无法处理那么多并行任务


在某种程度上,我们遇到了两种不同表示法之间的冲突:
具有隐式(或至少隐式)执行模式的传统结构化编码和独立、分布式、延迟计算的Spark表示法

然而,在filter()之后仍然需要持久化。。。它应该立即计算吗?这是一个迭代算法,所以我想知道我应该如何编程,因为我需要上一个计算的结果来进入下一个阶段。为了避免反模式,你可以在运行中进行计算,这将节省持续时间,这是一种方法,如果你能分享确切的数据和问题,我可以向你推荐一些其他的方法。
data = sc.textFile(dataset).cache()

while True:
    data.count()
    y = data.map(...).reduce(...)
    data = data.filter(lambda x: x < y).persist()