Skip to main content
 首页 » 编程设计

python之PySpark 中的高效列处理

2025年05月04日29findumars

我有一个包含大量列 (>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。
  • 使用二进制搜索对每一列进行搜索。