Pyspark 将列表的列转换为Dataframe

Pyspark 将列表的列转换为Dataframe,pyspark,apache-spark-sql,spark-dataframe,pyspark-sql,Pyspark,Apache Spark Sql,Spark Dataframe,Pyspark Sql,我在spark数据框中有一列列表 +---------+ |特征| +---------+ |[0,45,63,0,0,0,0]| |[0,0,0,85,0,69,0]| |[0,89,56,0,0,0,0]| +---------+ 如何将其转换为spark数据帧,其中列表中的每个元素都是数据帧中的一列?我们可以假设列表的大小相同 比如说, +----------+ |c1 | c2 | c3 | c4 | c5 | c6 | c7| +----------+ |0 |45|63|0 |0 |

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

+---------+ |特征| +---------+ |[0,45,63,0,0,0,0]| |[0,0,0,85,0,69,0]| |[0,89,56,0,0,0,0]| +---------+ 如何将其转换为spark数据帧,其中列表中的每个元素都是数据帧中的一列?我们可以假设列表的大小相同

比如说,

+----------+ |c1 | c2 | c3 | c4 | c5 | c6 | c7| +----------+ |0 |45|63|0 |0 |0 |0 | |0 |0 |0 |85|0 |69|0 | |0 |89|56|0 |0 |0 |0 | +----------+ 您可以使用getItem:

df.withColumnc1,df[features].getItem0\ .withColumnc2,df[特征].getItem1\ .withColumnc3,df[features].getItem2\ .withColumnc4,df[features].getItem3\ .withColumnc5,df[features].getItem4\ .withColumnc6,df[features].getItem5\ .withColumnc7,df[features].getItem6\ .删除“功能”。显示 +----------+ |c1 | c2 | c3 | c4 | c5 | c6 | c7| +----------+ |0 |45|63|0 |0 |0 |0 | |0 |0 |0 |85|0 |69|0 | |0 |89|56|0 |0 |0 |0 | +----------+
您所描述的实际上是操作的反转

您可以通过转换为中间RDD来实现,如下所示:

spark.version u'2.2.0' 您的数据: df.showtruncate=False +---------+ |特征| +---------+ |[0,45,63,0,0,0,0]| |[0,0,0,85,0,69,0]| |[0,89,56,0,0,0,0]| +---------+ 维度=7 out=df.rdd.maplambda x:[floatx[0][i]表示范围维度中的i]。toDFschema=[c'+stri+1表示范围维度中的i] 出演 +--+--+--+--+--+--+--+ |c1 | c2 | c3 | c4 | c5 | c6 | c7| +--+--+--+--+--+--+--+ |0.0|45.0|63.0| 0.0|0.0| 0.0|0.0| |0.0| 0.0| 0.0|85.0|0.0|69.0|0.0| |0.0|89.0|56.0| 0.0|0.0| 0.0|0.0| +--+--+--+--+--+--+--+
@desertnaut的答案也可以通过dataframe和udf实现

导入pyspark.sql.F函数 维度=7 列名称=['c'+stri+1表示范围维度中的i] splits=[F.udflambda val:val[i],范围维度中i的FloatType] df=df。选择*[s'features'。s的别名j,zipsplits中的j,列名称]
这里有一个不转换为rdd的替代方案

从pyspark.sql导入函数为F 不包括vectorAssembeler。 stop=df.selectF.maxF.size'features'。别名'size'。first.size如果有大小不同的列表,这可能很有用。 udf1=F.udflambda x:x.toArray.tolist,ArrayTypeFloatType df=df.带有列'features1',udf1'features' df.select*[df.features1[i]。别名'col{}'。范围1中i的格式,停止]。显示 +---+---+---+---+---+---+ |第1列|第2列|第3列|第4列|第5列|第6列| +---+---+---+---+---+---+ | 45| 63| 0| 0| 0| 0| | 0| 0| 85| 0| 69| 0| +---+---+---+---+---+---+
也许类似于?features列的数据类型是什么。您能发布您的架构吗?这对向量列或数组类型列有效吗?@Suresh nice catch-它对向量列测试不起作用,如果我们使用数组类型,我们可以直接对它进行索引。@mayankagrawal有效not@mayankagrawal类向量具有数组方法。只有类densevector和sparsevector有值。如果我错了,请纠正我。请勾选此项,问题指定“列表”列。为什么要在这里使用toArray?如果它是列表的一列,那么它很好,我们不需要udf本身。但是,我想到的是列名特性。@desertnaut iagree@desertnaut我也是,很好。作为奖励,我在你的帖子中添加了代码高亮显示@马扬卡格拉瓦尔