2017-03-02 47 views
0

我正在使用pyspark。我已經加載了.csv文件並將其轉換爲行。 之後,我選擇了一些列的,並把它們納入NumericalElementsRDD基於現有的在rdd中創建列

NumericalElementsRDD = elementsRDD.map(lambda p: Row(g1=int(p[30]), g2=int(p[31]), g3=int(p[32]))) 

的問題是,我需要創建另一列,讓我們稱之爲success_fail。它背後的邏輯是:success_fail values 1 if p[32] >= 10 else 0

我試圖做它在elementsRDD.map表達式中插入另一個lambda,但它沒有奏效。

你能幫我完成這個任務嗎?

回答

0

建立這個很容易。

請參閱您創建行的RDD。將其轉換爲Dataframe很容易。

NumericalElementsDF = NumericalElementsRDD.toDF() 

在此之後,你可以使用函數withColumn(),此功能將創建或更新現有列,請參閱here的文檔。

那麼,如何更新?使用此命令:

NumericalElementsDF.withColumn('g4', when(col('g3') >= 10, 1).otherwise(0)) 

你可以看到,我使用的功能when()這就像如果dataframes看到here

對於python,如果您將RDD轉換爲行的RDD。更好地使用數據框來獲得更快的響應。

+0

謝謝。但是我必須在創建DF之前插入列。 –

0

如果你想內RDD建立這個,你可以試試這個,

condition_Check = lambda v: 1 if v >= 10 else 0 
NumericalElementsRDD = elementsRDD.map(lambda p: Row(g1=int(p[30]), g2=int(p[31]), g3=int(p[32]),success_fail=condition_Check(int(p[32])))) 

使用dataframes或數據集而不是行類型提供更好的性能。

+0

嗨Suresh: 感謝您的回答。我已經編程它: def condition_check(v): 返回lambda v:1如果v> = 10 else 0 NumericalElementsRDD = elementsRDD.map(lambda p:Row(g1 = float(p [30]),g2 = float (p [31]),g3 = float(p [32]),success_fail = condition_check(float(p [32])))) 不幸的是它似乎不工作,因爲之後: ElementosNumericosRDD.take 5) 這需要表達式不起作用,如果我嘗試構建數據框,我也會收到錯誤消息。 –

+0

你得到的錯誤是什麼。 ? – Suresh