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

spark - Converting dataframe to list improving performance

我需要将 Spark 数据框的一列隐藏起来,以便稍后用于 matplotlib

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

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

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

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()
+-----+---+
| name|age|
+-----+---+
|Alice| 1|
| Bob| 2|
+-----+---+
>>> to_list = [list(row) for row in df.collect()]
print list
结果:[[u'Alice', 1], [u'Bob', 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]

此外,Pandas() 方法只应在生成的 Pandas 的 DataFrame 预计较小时使用,因为所有数据都加载到驱动程序的内存中。