我需要将一列Spark数据帧转换为列表,以便稍后用于matplotlib
df.toPandas()[col_name].values.tolist()
看起来高性能开销此操作大约需要18秒 还有其他方法可以做到这一点或提高性能吗?
答案 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较小的情况下使用,因为所有数据均已加载到驱动程序的内存中。