Python 如何向pyspark中的行添加值?
我有一个如下所示的数据帧:Python 如何向pyspark中的行添加值?,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我有一个如下所示的数据帧: preds.take(1) [Row(_1=0, _2=Row(val1=False, val2=1, val3='high_school'))] preds.take(1) [Row(ID=0, val1=False, val2=1, val3='high_school')] 我希望整个事情是一行,没有嵌套的行在那里。因此,第一个值将获得一个名称,并且是单行对象的一部分。如果我想将其命名为“ID”,它将如下所示: preds.take(1) [Row(_1=0,
preds.take(1)
[Row(_1=0, _2=Row(val1=False, val2=1, val3='high_school'))]
preds.take(1)
[Row(ID=0, val1=False, val2=1, val3='high_school')]
我希望整个事情是一行,没有嵌套的行在那里。因此,第一个值将获得一个名称,并且是单行对象的一部分。如果我想将其命名为“ID”,它将如下所示:
preds.take(1)
[Row(_1=0, _2=Row(val1=False, val2=1, val3='high_school'))]
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)
由于
行
是一个元组
,元组
是不可变的,因此只能创建一个新对象。使用纯元组:
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')
或保留\uuuu字段\uuuuu
:
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")
最后一个选项对我来说最有意义。我没有意识到我应该避免对行本身进行操作,但这是有道理的。非常感谢。