web-dev-qa-db-ja.com

新しいSpark最初のデータフレームの列に基づいた新しい列の値を持つDataFrameの作成Java

これは簡単なはずですが、... Spark 1.6.1 ....を使用しています。列A、B、CのDataFrame#1があります。

A  B  C
1  2  A
2  2  A
3  2  B
4  2  C

次に、新しい列Dで新しいデータフレームを作成します。

DataFrame df2 = df1.withColumn("D", df1.col("C"));

これまでのところ非常に良いですが、実際には列Dの値を条件付きにする必要があります:

// pseudo code
if (col C = "A") the col D = "X"
else if (col C = "B") the col D = "Y"
else col D = "Z"

次に、列Cをドロップし、Dの名前をCに変更します。列関数を調べてみましたが、法案に合うものは何もありません。私はdf1.rdd()。map()を使用して行を反復処理することを考えましたが、実際にそれを機能させることができなかったことを除けば、DataFramesの全ポイントはRDD抽象化から遠ざかることであると思いましたか?

残念ながら、これはJava(そしてもちろんSpark with Javaは最適ではありません!!)。私は明らかなことを見逃しているようで、解決策が提示されたときにばかであることが示されてうれしいです!

12
user1128482

whenを使用してそれを達成できると思います。さらに、おそらく古い列を直接置き換えることができます。たとえば、コードは次のようになります。

import static org.Apache.spark.sql.functions.*;

Column newCol = when(col("C").equalTo("A"), "X")
    .when(col("C").equalTo("B"), "Y")
    .otherwise("Z");

DataFrame df2 = df1.withColumn("C", newCol);

whenの詳細については、 Column Javadoc を確認してください。

19
Daniel de Paula

ダニエルのおかげで私はこれを解決しました:)

不足している部分は、SQL関数の静的インポートでした

import static org.Apache.spark.sql.functions.*;

Whenを使用する方法は数百万通り試してみたに違いありませんが、インポートを実行しなかったため、コンパイルエラー/ランタイムエラーが発生しました。ダニエルの答えをインポートすると、すぐにわかりました!

3
user1128482

Udfを使用して同じ仕事をすることもできます。単純なif then else構造を記述するだけです

import org.Apache.spark.sql.functions.udf
val customFunct = udf { d =>
      //if then else construct
    }

val new_DF= df.withColumn(column_name, customFunct(df("data_column")))
1
sudeepgupta90