为什么将Spark DataFrame的每个分区映射到Pandas Dataframe之后,我只能在其分区上循环一次?
例如,我将为此输出
columns = sdf.schema.fieldNames()
parts = sdf.repartition(2).rdd.mapPartitions(lambda iterator: [pd.DataFrame(list(iterator), columns=columns)]).toLocalIterator()
for df in parts:
print(df.shape)
但是下次我运行循环时:
for df in parts:
print(df.shape)
几乎没有计算时间或输出。
答案 0 :(得分:0)
toLocalIterator()
返回Scala Iterator
(通过python的Java网关)。
在Scala中,Iterator
特质扩展了TraversableOnce
。顾名思义,它只能迭代一次(并且只能使用next()
方法)。
对
it.next()
的调用将返回迭代器的下一个元素,并且 推进迭代器的状态。在同一电话上再次调用next
然后,迭代器将产生的元素比返回的元素多一 先前。如果没有其他要返回的元素,则对next
的调用将引发NoSuchElementException
。
如果您需要对同一个集合进行两次迭代,则可以使用duplicate()
来获得两个可独立遍历的迭代器实例。