Skip to main content
 首页 » 编程设计

python之如何向 pyspark 中的行添加值

2024年10月17日29kuangbin

我有一个看起来像这样的数据框:

preds.take(1) 
[Row(_1=0, _2=Row(val1=False, val2=1, val3='high_school'))] 

我希望整个内容都排成一行,其中没有嵌套行。因此,第一个值将获得一个名称并成为单行对象的一部分。如果我想将它命名为“ID”,它看起来像这样:

preds.take(1) 
[Row(ID=0, val1=False, val2=1, val3='high_school')] 

我已经在 map 中尝试了各种方法,但没有产生我正在寻找的东西(或出现错误)。我试过:

preds.map(lambda point: (point._1, point._2)) 
preds.map(lambda point: point._2.append(point._1)) 
preds.map(lambda point: point._2['ID']=point._1) 
preds.map(lambda point: (point._2).ID=point._1) 

请您参考如下方法:

因为 Row 是一个 tuple 而 tuple 是不可变的,所以你只能创建一个新对象。使用普通元组:

from pyspark.sql import Row 
 
r = Row(_1=0, _2=Row(val1=False, val2=1, val3='high_school')) 
r[:1] + r[1] 
## (0, False, 1, 'high_school') 

或保留__fields__:

Row(*r.__fields__[:1] + r[1].__fields__)(*r[:1] + r[1]) 
## Row(_1=0, val1=False, val2=1, val3='high_school')  

在实践中,应该避免直接对行进行操作,而应使用 DataFrame DSL 而无需将数据提取到 Python 解释器:

df = sc.parallelize([r]).toDF() 
 
df.select("_1", "_2.val1", "_2.val2", "_2.val3")