如何根据PySpark数据帧的另一列中的值修改列? F.边缘情况

问题描述 投票:2回答:1

我想浏览一个pyspark数据框中的每一行,并根据另一列的内容更改列的值。我将其更改为的值也基于要更改的列的当前值。

具体来说,我有一个包含DenseVectors的列,另一个包含我需要的向量索引的列。

或者,我也可以用DenseVector中两个值中较大的一个替换DenseVector。

我主要是尝试将F.when()与withColumn结合使用,但是我遇到了F.when()的第二个元素的问题,因为我想存储正确的向量索引,但不能直接索引一栏。

   a                        b  
1  DenseVector([0.1, 0.9])  1.0
2  DenseVector([0.6, 0.4])  0.0
.
.
.
df = df.withColumn('a', F.when(df.b == 0.0, df.a[0])
                  .otherwise(df.a[1])
python dataframe pyspark apache-spark-sql pyspark-sql
1个回答
1
投票

通过遵循this question答案中的信息,我能够得出一个解决方案。

似乎Spark中存在一个错误,它不允许您对Spark数据帧中包含的DenseVectors进行索引。这可以通过创建用户定义的函数来解决,该函数访问像numpy数组这样的元素。

from pyspark.sql import functions as F
from pyspark.sql import types as T

firstelement=F.udf(lambda v:float(v[0]),T.FloatType())
secondelement=F.udf(lambda v:float(v[1]),T.FloatType())


df = df.withColumn('a', F.when(df['b'] == 0.0, 
     firstelement('a')).otherwise(secondelement('a'))
© www.soinside.com 2019 - 2024. All rights reserved.