使用后,toLocalIterator似乎为空

时间:2020-05-06 19:36:15

标签: python pandas scala apache-spark pyspark

为什么将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)

几乎没有计算时间或输出。

1 个答案:

答案 0 :(得分:0)

toLocalIterator()返回Scala Iterator(通过python的Java网关)。

在Scala中,Iterator特质扩展了TraversableOnce。顾名思义,它只能迭代一次(并且只能使用next()方法)。

it.next()的调用将返回迭代器的下一个元素,并且 推进迭代器的状态。在同一电话上再次调用next 然后,迭代器将产生的元素比返回的元素多一 先前。如果没有其他要返回的元素,则对next的调用将引发 NoSuchElementException

如果您需要对同一个集合进行两次迭代,则可以使用duplicate()来获得两个可独立遍历的迭代器实例。