我最近需要从spark中收集RDD中的大数据。问题是数据的大小太大,以至于我无法收集所有数据并将其存储在驱动程序的内存中。所以我尝试了多种方法来实现它,但仍然失败了。
首先,我需要使用索引标记RDD中的记录,因此我使用了zipWithIndex()函数。
之后,我尝试了第一种方法:我使用take()函数从RDD收集前1000万条记录,然后对这1000万条记录进行迭代以进行一些处理。完成后,我从RDD中过滤掉前1000万条记录,然后从新RDD(过滤后的一条)获取前1000万条记录,然后再次进行迭代。执行此循环直到RDD为空。 - >这不起作用,因为我需要计算初始RDD以获得记录的总数,而这似乎消耗了大量内存。无论如何,它最终失败了。
接下来我尝试了第二种方法:我使用toLocalIterator直接获取RDD的迭代器,并对驱动程序进行迭代和处理。这似乎是一个解决方案,但事实证明,性能非常糟糕。它在hasNext()上花费的时间太多了。测试仍在进行中。即使它有效,性能也达不到要求。
有没有其他方法来实现这种事情?非常感谢。