使用基于第一个数据框Java

时间:2016-05-07 15:44:58

标签: java apache-spark dataframe apache-spark-sql

这应该很容易但......使用Spark 1.6.1 .... 我有DataFrame#1,列A,B,C。值:

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.我已经尝试查看Column功能但似乎没有任何内容符合要求。我想过使用df1.rdd()。map()并迭代这些行,但除了实际上并没有让它工作之外,我有点认为DataFrames的重点是要远离RDD抽象?

不幸的是我必须用Java做这件事(当然Spark和Java并不是最佳的!!)。似乎我错过了显而易见的东西,很高兴在提出解决方案时被证明是个白痴!

3 个答案:

答案 0 :(得分:18)

我相信您可以使用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

答案 1 :(得分:2)

感谢Daniel,我已经解决了这个问题:)

缺少的部分是sql函数的静态导入

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

我必须尝试过一百万种不同的使用方式,但由于我没有进行导入,因此遇到了编译失败/运行时错误。一旦导入丹尼尔的答案就在现场!

答案 2 :(得分:1)

您也可以使用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")))
相关问题