我有一个包含大量列(> 30000)的数据框。
我用它填充1
and 0
基于第一列,如下所示:
for column in list_of_column_names:
df = df.withColumn(column, when(array_contains(df['list_column'], column), 1).otherwise(0))
然而这个过程需要很多时间。有没有办法更有效地做到这一点?有些事情告诉我列处理可以并行化。
Edit:
输入数据示例
+----------------+-----+-----+-----+
| list_column | Foo | Bar | Baz |
+----------------+-----+-----+-----+
| ['Foo', 'Bak'] | | | |
| ['Bar', Baz'] | | | |
| ['Foo'] | | | |
+----------------+-----+-----+-----+
除了非常宽的数据之外,您的代码没有任何具体错误:
for column in list_of_column_names:
df = df.withColumn(...)
只生成执行计划。
一旦评估结果,实际的数据处理将并发和并行化。
然而,这是一个昂贵的过程,因为它需要O(NMK)N 行的运算,M列和K列表中的值。
此外,对非常广泛的数据执行计划的计算成本非常昂贵(尽管成本在记录数量方面是恒定的)。如果它成为限制因素,你可能会更好RDDs
:
- 使用对列数组进行排序
sort_array
功能。
- 将数据转换为
RDD
.
- 使用二分搜索对每一列应用搜索。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)