toLocalIterator 使用后似乎为空

Posted

技术标签:

【中文标题】toLocalIterator 使用后似乎为空【英文标题】:toLocalIterator seems empty after using it 【发布时间】:2020-05-06 19:36:15 【问题描述】:

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

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

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

it.next() 的调用将返回迭代器的下一个元素,并且 推进迭代器的状态。再次调用next 然后迭代器将在返回的元素之外产生一个元素 之前。如果没有更多元素要返回,对next 的调用将抛出一个 NoSuchElementException.

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

【讨论】:

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

检查对象是否为空,使用ng-show但不能使用控制器?

.load(SqlDataReader) 后数据表为空

React native - 如果表单提交时为空,则突出显示 TextInput

解决使用mybatis模糊查询为空的问题

构建发布版本 Retrofit2 后获得 200 但为空数据

ToListAsync 抛出“值不能为空”。例外