使用toLocalIterator后似乎为空。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用toLocalIterator后似乎为空。相关的知识,希望对你有一定的参考价值。

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

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

答案

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

在Scala中。Iterator 特质延伸 TraversableOnce. 顾名思义,它只能迭代一次(而且只能通过使用 next() 方法)。)

调用 it.next() 将返回迭代器的下一个元素并推进迭代器的状态。调用 next 再调用同一个迭代器,就会得到之前返回的元素之外的一个元素。如果没有更多的元素要返回,则调用 next 会抛出 NoSuchElementException.

如果你需要在同一个集合上迭代两次,你可能可以使用 duplicate() 以获得两个可独立遍历的迭代器实例。

以上是关于使用toLocalIterator后似乎为空。的主要内容,如果未能解决你的问题,请参考以下文章

.load(SqlDataReader) 后数据表为空

Android 6.0 api 23 - 获得许可后,我的位置为空[重复]

使用 Thymeleaf 时,Spring 安全会话范围似乎为空

反应原生原生模块 RCTBubblingEventBlock 为空

在 wpf 中的自定义样式上,文本框的文本始终为空

XMPP JID 似乎总是为空