2016-06-20 19 views
1

我有一個數據幀,看起來像這樣:如何在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

由於是tupletuples是不可變的,你只能創建一個新的對象。使用普通的元組:

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

最後一個選項對我來說最有意義。沒有意識到我應該避免在行上自己操作,但這是有道理的。謝謝! – lilyrobin