有没有更快的方法将一列 pyspark 数据框转换为 python 列表? (Collect() 非常慢)

Posted

技术标签:

【中文标题】有没有更快的方法将一列 pyspark 数据框转换为 python 列表? (Collect() 非常慢)【英文标题】:is there a faster way to convert a column of pyspark dataframe into python list? (Collect() is very slow ) 【发布时间】:2020-07-20 17:14:35 【问题描述】:

我正在尝试使用 collect 函数将一列 pyspark 数据框存储到 python 列表中。 例如

list_a = [row[column_name] for dataset_name.collect()中的行]

但这是一个非常缓慢的过程,对于 3 列和 27 行的数据帧需要超过 10 秒。

有没有更快的方法?

我尝试在此步骤之前缓存数据。使用此步骤,上述查询将在 2 秒内执行,但缓存步骤本身需要大约 7-8 秒,因此我减少时间的目的并未完全实现。

而且我的代码是这样的,我需要在此步骤之前每次都重建数据帧,因此需要再次进行缓存,因此这一步(缓存数据帧)对缩短时间没有太大帮助。

提前致谢!

【问题讨论】:

【参考方案1】:

只需收集一列数据即可对您的代码进行轻微优化:

list_a = [row[column_name] for row in dataset_name.select(column_name).collect()]

如果你使用quinn,这段代码会更干净:

import quinn

list_a = quinn.column_to_list(df, col_name)

collect() 将所有数据传输到驱动节点,成本很高。您只能通过收集更少的数据来加快速度(例如,dataset_name.select(column_name).distinct().collect() 通常会更快)。

Spark 针对在集群中分布数据集和并行运行计算进行了优化。 Spark 的分布式特性使得在单个节点上收集结果的计算速度相对较慢。

【讨论】:

以上是关于有没有更快的方法将一列 pyspark 数据框转换为 python 列表? (Collect() 非常慢)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 pyspark 数据框中更快地保存 csv 文件?

如何将一列除以pyspark中的其他几个子列?

如何将一列数据框转换为具有json格式值的分布列(PYTHON)

如何将 json 转换为 pyspark 数据帧(更快的实现)[重复]

加入两个数据框pyspark

按组将一列转换为多列