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 预计较小时使用,因为所有数据都加载到驱动程序的内存中。
我需要将 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 预计较小时使用,因为所有数据都加载到驱动程序的内存中。