2016-07-28 95 views
0

在PySpark中,我們不能使用傳統的熊貓或R風格的符號來創建基於DataFrame中舊列的新列。例如,假設我嘗試連接兩個列:在PySpark數據框中,爲什麼__setitem__沒有完全實現?

import pyspark.sql.functions as F 
df['newcol'] = F.concat(df['col_1'], df['col_2']) 

結果:

TypeError: 'DataFrame' object does not support item assignment 

相反,實現的方法做,這是

df = df.withColumn('newcol', F.concat(df['col_1'], df['col_2'])) 

是否有一個原因PySpark不實現傳統的DataFrame表示法?

回答

1

你可以找到多種理由來實現這種方式以及一些反例(SparkR API),但它會爭辯說根本原因是實現純度。

與R或Pandas數據幀不同,Spark DataFrame是不可變的數據結構。模式的每一次變化都會創建一個全新的DataFrame,因此任何會提示的操作都只是誤導。

理論上一個可以逃脫通過更換到JVM DataFrame參考實施__setitem__,但如果你認爲這是一個DataFrame的身份是_jdf非常明確的,這將是相當unpythonic。

+0

我想我明白了。換句話說,傳統的數據框是可變對象(向量列表),而Spark DataFrames是不可變的,因爲Spark是在功能性編程模型中設計的。 '__setitem__'是一個突變,不適用於不可變對象。 – Paul

+0

是的,完全...你可以自己實施它和猴子補丁,但它會聞到魚腥味。 – zero323

相關問題