web-dev-qa-db-ja.com

Sparkデータフレームの既存の列全体を新しい列で上書きする方法は?

spark列をバイナリフラグである新しい列で上書きします。

列id2を直接上書きしてみましたが、なぜPandasのインプレース操作のように機能しないのですか?

Withcolumn()を使用せずに新しい列を作成し、drop()を使用して古い列を削除せずにそれを行う方法は?

spark dataframeは不変であることがわかります。その理由は、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|
+-------+----------+----+
7
GeorgeOfTheRF

使用できます

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

withColumnRenamedは、既存の列の名前を新しい名前に変更します。

withColumnは、指定された名前で新しい列を作成します。すでに存在する場合は同じ名前の新しい列を作成し、古い列を削除します。

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

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

上記の場合、問題なく機能するはずです。

お役に立てれば!

13
koiralo

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

目的の効果を実現する最速の方法は、withColumnを使用することです。

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

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

あなたの場合、それは見ることができます:

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

nanを0より大きい値として扱いたくないので、nanとの比較を追加しました。

3
Piotr Kalański

異なる結合テーブルで同じ名前の複数の列を使用している場合は、withColumnのcolNameでテーブルエイリアスを使用できます。

例えば。 df1.join(df2, df1.id = df2.other_id).withColumn('df1.my_col', F.greatest(df1.my_col, df2.my_col))

また、df1の列のみを保持したい場合は、.select('df1.*')を呼び出すこともできます。

代わりにdf1.join(df2, df1.id = df2.other_id).withColumn('my_col', F.greatest(df1.my_col, df2.my_col))を実行する場合

My_colと呼ばれる最後の列を上書きすると思います。したがって、次のように出力されます:id, my_col (df1.my_col original value), id, other_id, my_col (newly computed my_col)

1
Trang Pham