2016-07-28 12 views
0

PySparkでは、従来のパンダやRスタイル表記を使用して、DataFrameの古い列に基づいて新しい列を作成することはできません。たとえば、私は2つの列を連結しようと言う:PySpark DataFramesでは、__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 

代わりに、これを行うための実装方法はPySparkがない理由は

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

ありさ従来のDataFrame表記法を実装しますか?

答えて

1

このように実装する理由はいくつかありますが、いくつかの反例(SparkR API)がありますが、基本的な理由は実装の純度であると主張します。

RまたはPandasデータフレームと異なり、Spark DataFrameは不変のデータ構造です。スキーマが変更されるたびに全く新しいDataFrameが作成されるため、そうでないと示唆される操作は単に誤解を招きます。

理論的には1は、JVM DataFrameへの参照を交換して__setitem__を実装して逃げることができていますがDataFrameのアイデンティティが、これはかなりunpythonicだろう_jdfによって、かなり明確であることを考慮すれば。

+0

ご理解いただけると思います。言い換えれば、従来のデータフレームは可変オブジェクト(ベクトルのリスト)ですが、Spark DataFramesは不変ですが、Sparkは関数型プログラミングモデル内で設計されています。 '__setitem__'は突然変異であり、不変オブジェクトには適用できません。 – Paul

+0

はい、まさに...あなた自身とサルのパッチを実装することができますが、それは魚の臭いを帯びます。 – zero323

関連する問題