将列表列转换为 Dataframe 列

Convert Column of List to a Dataframe Column

我在 spark 数据框中有一列列表。


+-----+----------+
|c1   |  c2      |
+-----+----------+
|a |[1, 0, 1, 1] |
|b |[0, 1, 1, 0] |
|c |[1, 1, 0, 0] |
+-----+----------+

如何将其转换为另一个 spark 数据框 ,其中每个列表都变成一个数据框列 ?此外,列 'c1' 中的每个条目都是创建的新列的名称。如下所示。

+--------+
|a| b | c| 
+--------+
|1 |0| 1 |
|0 |0| 1 |
|1 |1| 0 |
|1 |0| 0 |
+--------+

注意: 我确实考虑过以下操作: 然后对结果矩阵进行转置。但是,这会创建很多列 [因为我拥有的列表数据的大小非常大],因此不是一个有效的解决方案。

欢迎任何帮助。

import pyspark.sql.functions as F

#Not a part of the solution, only used to generate the data sample
df = spark.sql("select stack(3 ,'a',array(1, 0, 1, 1), 'b',array(0, 1, 1, 0) ,'c',array(1, 1, 0, 0)) as (c1,c2)")

df.groupBy().pivot('c1').agg(F.first('c2')).selectExpr('inline(arrays_zip(*))').show()

+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  0|  1|
|  0|  1|  1|
|  1|  1|  0|
|  1|  0|  0|
+---+---+---+

这可以很容易地针对大型数据集进行测试

df = sql("select id as c1, transform(sequence(1,10000), e -> tinyint(round(rand()))) as c2 from range(10000)")

刚刚在具有 4 个内核和 32 GB RAM (Azure Databricks) 的 VM 上成功执行了 10K 个数组,每个数组有 10K 个元素。
耗时 5.35 分钟。