Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python spark-将数据帧转换为列表提高性能_Python_Performance_Pandas_Apache Spark_Pyspark - Fatal编程技术网

Python spark-将数据帧转换为列表提高性能

Python 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

我需要将Spark数据框的一列转换为列表,以便稍后用于matplotlib

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()来获得更高的性能