我有一个包含大量列 (>30000) 的数据框。
我在第一列的基础上用 1 和 0 填充它,如下所示:
for column in list_of_column_names:
df = df.withColumn(column, when(array_contains(df['list_column'], column), 1).otherwise(0))
但是这个过程需要很多时间。有没有办法更有效地做到这一点?有些东西告诉我列处理可以并行化。
编辑:
示例输入数据
+----------------+-----+-----+-----+
| list_column | Foo | Bar | Baz |
+----------------+-----+-----+-----+
| ['Foo', 'Bak'] | | | |
| ['Bar', Baz'] | | | |
| ['Foo'] | | | |
+----------------+-----+-----+-----+
请您参考如下方法:
除了非常宽的数据之外,您的代码没有特别的错误:
for column in list_of_column_names:
df = df.withColumn(...)
只生成执行计划。
一旦结果被评估,实际的数据处理将并发和并行化。
然而,这是一个昂贵的过程,因为它需要对列表中的 N 行、M 列和 K 个值进行 O(NMK) 操作.
此外,针对非常宽的数据执行计划的计算成本非常高(尽管成本在记录数量方面是恒定的)。如果它成为一个限制因素,你可能会更好地使用 RDDs:
- 使用
sort_array函数对列数组进行排序。 - 将数据转换为
RDD。 - 使用二进制搜索对每一列进行搜索。
