Python spark-将数据帧转换为列表提高性能
我需要将Spark数据框的一列转换为列表,以便稍后用于matplotlibPython spark-将数据帧转换为列表提高性能,python,performance,pandas,apache-spark,pyspark,Python,Performance,Pandas,Apache Spark,Pyspark,我需要将Spark数据框的一列转换为列表,以便稍后用于matplotlib df.toPandas()[col_name].values.tolist() 看起来有很高的性能开销。此操作大约需要18秒 有没有其他方法可以做到这一点或改进性能?如果您确实需要一个本地列表,您在这里可以做的不多,但有一个改进是只收集一列而不是整个数据帧: df.select(col_name).flatMap(lambda x: x).collect() 您可以这样做: >>> [list(ro
df.toPandas()[col_name].values.tolist()
看起来有很高的性能开销。此操作大约需要18秒
有没有其他方法可以做到这一点或改进性能?如果您确实需要一个本地列表,您在这里可以做的不多,但有一个改进是只收集一列而不是整个
数据帧:
df.select(col_name).flatMap(lambda x: x).collect()
您可以这样做:
>>> [list(row) for row in df.collect()]
示例:
>>d=[[Alice',1],[Bob',2]
>>df=spark.createDataFrame(d,['name','age'])
>>df.show()
+----+-+
|姓名|年龄|
+----+-+
| Alice | 1 |
| Bob | 2 |
+----+-+
>>to_list=[df.collect()中的行的列表(行)]
打印列表
结果:[[u'Alice',1],[u'Bob',2]
您可以使用迭代器来节省内存到本地读写器。迭代器将消耗的内存与此系统中最大的分区一样多。如果只需要使用一次结果,那么迭代器就是完美的
d = [['Bender', 12], ['Flex', 123],['Fry', 1234]]
df = spark.createDataFrame(d, ['name', 'value'])
df.show()
+------+-----+
| name|value|
+------+-----+
|Bender| 12|
| Flex| 123|
| Fry| 1234|
+------+-----+`
values = [row.value for row in df.toLocalIterator()]
print(values)
>>> [12, 123, 1234]
另外,只有当生成的Pandas的数据帧很小时,才应使用toPandas()方法,因为所有数据都加载到驱动程序的内存中。我猜性能开销在toPandas()中,因为这是链中的第一个操作。@JiriS我能做些什么?这一列中有多少数据?Spark必须将该列的所有数据发送到驱动程序(加上序列化/反序列化开销)。你在使用kryo序列化吗?如果不启用它。它并没有真正帮助我。也许可以做些别的事情?除了放弃一个完整的想法?不是真的。为什么需要本地列表?对于matplotlib,可能还有其他一些wayWell,对于初学者,您可以仔细检查管道。有什么理由期待更快的执行吗?您是否缓存重复使用的数据?除此之外,考虑使用更智能的可视化技术(采样、ButkPoT、不同的外推方法、阴影),这些技术不需要完整的数据。您现在收集了多少数据?几个月后,您回答了这个问题,指出dataframe上不再支持flatMap,而这段代码可能会回答这个问题,提供关于如何和/或为什么解决问题的附加上下文将提高答案的长期价值。请阅读本文以提供高质量的答案。根据@Artem Osipov的答案,您可以使用df.tolocaterator()而不是df.collect()来获得更高的性能