2017-06-21 129 views
0

我想知道是否有方法可以同時更改PySpark數據框的兩個(或多個)列。現在我正在使用withColumn,但我不知道這是否意味着該條件將被檢查兩次(對於大型數據幀,這對我來說太昂貴了)。這段代碼基本上檢查其他兩列(對於同一行)中的值,並基於它將兩列更改爲無/空。PySpark數據框:根據條件同時更改兩列

condition = is_special_id_udf(col("id"))) & should_hide_response_udf(col("response_created")) 


    new_df = df.withColumn(
      "response_text", 
      when(condition, None) 
      .otherwise(col("response_text")) 
     ) 

    new_df = df.withColumn(
      "response_created", 
      when(condition, None) 
      .otherwise(col("response_created")) 
     ) 
+0

請分享完整的代碼和示例數據。你的代碼是不可重現的。 – mtoto

+0

你真的需要這些數據嗎?代碼工作正常,我只是想知道是否有更好的方法來做同樣的事情。 – mfcabrera

+0

您正在創建兩個相同的列,是您的問題該怎麼做? – mtoto

回答

1

的第一件事情,你可以簡單地將UDF作爲新列,用它進行計算,並把它:

condition = is_special_id_udf(col("id"))) & should_hide_response_udf(col("response_created")) 

new_df = df.withColumn("tmp", condition).withColumn(
     "response_text", 
     when(col("tmp"), None) 
     .otherwise(col("response_text")) 
    ).withColumn(
     "response_created", 
     when(col("tmp"), None) 
     .otherwise(col("response_created")) 
    ).drop("tmp") 

如果你真的想生成兩列,那麼你可以做創建一個struct列和壓平它(當然,添加列,你需要選擇):

new_df = df.withColumn(
     "myStruct", 
     when(condition, None) 
     .otherwise(struct(col("response_text"), col("response_created"))) 
    ).select("myStruct.*") 
+0

第二種選擇是相當不錯的,使我的答案過時。 – mtoto

+0

我認爲答案的第一部分就是我所看到的,我想知道是否有一種方法沒有創建一個條件結果列,但看起來更乾淨。 – mfcabrera