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

时间:2016-02-12 13:43:19

标签: python performance pandas apache-spark pyspark

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

df.toPandas()[col_name].values.tolist()

看起来高性能开销此操作大约需要18秒 还有其他方法可以做到这一点或提高性能吗?

3 个答案:

答案 0 :(得分:4)

如果你真的需要一个本地列表,那么你可以在这里做的很多,但一个改进是只收集一个列而不是整个DataFrame

df.select(col_name).flatMap(lambda x: x).collect()

答案 1 :(得分:3)

你可以这样做:

>>> [list(row) for row in df.collect()]

例:
>>> d = [['Alice', 1], ['Bob', 2]]
>>> df = spark.createDataFrame(d, ['name', 'age'])
>>> df.show()
+-----+---+
| name|age|
+-----+---+
|Alice| 1|
| Bob| 2|
+-----+---+
>>> to_list = [list(row) for row in df.collect()]
print list
结果:[[u'Alice', 1], [u'Bob', 2]]

答案 2 :(得分:2)

您可以使用迭代器来节省内存toLocalIterator。迭代器将消耗与其最大的分区一样多的内存。而且,如果只需要使用一次结果,则在这种情况下,迭代器是完美的。

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]

toPandas()方法也应仅在预期所得的Pandas的DataFrame较小的情况下使用,因为所有数据均已加载到驱动程序的内存中。