如何在pyspark中的行中添加值?

时间:2016-06-20 17:34:46

标签: python apache-spark pyspark

我有一个如下所示的数据框:

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')]

我在地图中尝试了各种各样的东西,但没有任何东西正在产生我正在寻找(或获得错误)的东西。我试过了:

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)

1 个答案:

答案 0 :(得分:2)

由于Rowtupletuples是不可变的,因此您只能创建一个新对象。使用普通元组:

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")