これは簡単なはずですが、... 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は最適ではありません!!)。私は明らかなことを見逃しているようで、解決策が提示されたときにばかであることが示されてうれしいです!
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 を確認してください。
ダニエルのおかげで私はこれを解決しました:)
不足している部分は、SQL関数の静的インポートでした
import static org.Apache.spark.sql.functions.*;
Whenを使用する方法は数百万通り試してみたに違いありませんが、インポートを実行しなかったため、コンパイルエラー/ランタイムエラーが発生しました。ダニエルの答えをインポートすると、すぐにわかりました!
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")))