基于第一个数据帧Java中的列创建具有新列值的新Spark数据帧
这应该很容易,但是…使用Spark 1.6.1。。。。 我有一个数据帧#1,它有A、B、C列,值为:基于第一个数据帧Java中的列创建具有新列值的新Spark数据帧,java,apache-spark,dataframe,apache-spark-sql,Java,Apache Spark,Dataframe,Apache Spark Sql,这应该很容易,但是…使用Spark 1.6.1。。。。 我有一个数据帧#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
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()并对行进行迭代,但除了没有真正设法让它工作之外,我有点认为数据帧的整个要点是远离rdd抽象
不幸的是,我必须用Java来实现这一点(当然,使用Java的Spark不是最优的!!)。似乎我忽略了显而易见的问题,我很高兴在给出解决方案时被证明是个白痴 我相信您可以在时使用
来实现这一点。此外,您可能可以直接替换旧列。例如,代码如下所示:
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);
有关的更多详细信息,请查看。感谢Daniel,我已解决此问题:)
缺少的部分是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")))
谢谢你-我确实是直截了当地说:s-我缺少的是sql函数的静态导入,即:import static org.apache.spark.sql.functions.*@user1128482对不起,我忘了导入。很高兴知道你最后发现了。