1

スパーク列をバイナリフラグである新しい列で上書きします。Sparkデータフレーム内の既存の列全体を新しい列で上書きする方法は?

私は列id2を直接上書きしようとしましたが、なぜPandasのインプレイス操作のようには機能しませんか?

withcolumn()を使用して新しい列を作成し、drop()メソッドを使用して古い列を削除する方法はありますか?

私はスパークのデータフレームが不変であることを知っています。その理由は、withcolumn()を使用せずに上書きする別の方法ですか?& drop()?

df2 = spark.createDataFrame(
     [(1, 1, float('nan')), (1, 2, float(5)), (1, 3, float('nan')), (1, 4, float('nan')), (1, 5, float(10)), (1, 6, float('nan')), (1, 6, float('nan'))], 
     ('session', "timestamp1", "id2")) 

    df2.select(df2.id2 > 0).show() 

+---------+ 
|(id2 > 0)| 
+---------+ 
|  true| 
|  true| 
|  true| 
|  true| 
|  true| 
|  true| 
|  true| 
+---------+ 
# Attempting to overwriting df2.id2 
    df2.id2=df2.select(df2.id2 > 0).withColumnRenamed('(id2 > 0)','id2') 
    df2.show() 
#Overwriting unsucessful 
+-------+----------+----+ 
|session|timestamp1| id2| 
+-------+----------+----+ 
|  1|   1| NaN| 
|  1|   2| 5.0| 
|  1|   3| NaN| 
|  1|   4| NaN| 
|  1|   5|10.0| 
|  1|   6| NaN| 
|  1|   6| NaN| 
+-------+----------+----+ 
+0

火花としてnanを扱いたくないことができますと仮定していますので、私は、nanとの比較を追加しましたそれがあなたが探しているものならば、パンダのようにインプレイスを書く。 DataFramesは不変構造です。上書きすることはできません。 – eliasah

答えて

2

あなたは

d1.withColumnRenamed("colName", "newColName") 
d1.withColumn("newColName", $"colName") 

withColumnRenamed

withColumnは、指定された名前を持つ新しい列を作成し、新しい名前に既存の列の名前を変更し使用することができます。既に存在する場合は同じ名前の新しい列を作成し、古い列を削除します。

元のデータフレームdf2では、列の名前が変更され、後で使用するために新しい変数に割り当てる必要がある新しいデータフレームとして返されます。

`d3 = df2.select((df2.id2 > 0).alias("id2")` 

は、この情報がお役に立てば幸いあなたのケースで正常に動作する必要があります!

+0

私はこれがあなたの混乱を解消することを願っています。 –

1

上記のように、不変なコレクションであるDataFrameオブジェクトを上書きすることはできないため、すべての変換が新しいDataFrameを返します。

ご所望の効果を達成するための最速の方法はwithColumnを使用することです:

df = df.withColumn("col", some expression) 

colは、あなたが「置き換え」する列の名前です。実行後、df変数の値は、新しいDataFrameで置き換えられ、新しい値の列colに置き換えられます。これを新しい変数に割り当てることができます。

あなたのケースでは見ることができます:

df2 = df2.withColumn("id2", (df2.id2 > 0) & (df2.id2 != float('nan'))) 

を私は「あなたが0より大きい

+0

id2列はもともとdf2に存在します。だから、withColumn()を使って既存の名前id2のdf2に新しい列を作成しようとすると、 "id2は既に存在しているので変更できません"という競合エラーが発生しないのはなぜですか?説明してください。withcolumn()はどのように動作しますか? –

+1

カラムがすでに存在する場合はwithColumn()は例外をスローしません。カラムが存在する場合は古いカラムを削除し、変更データで新しいカラムを作成します。 –

関連する問題