有没有更快的方法将一列 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() 非常慢)的主要内容,如果未能解决你的问题,请参考以下文章
如何将一列数据框转换为具有json格式值的分布列(PYTHON)