将列表列转换为 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 分钟。
我在 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 分钟。