Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于第一个数据帧Java中的列创建具有新列值的新Spark数据帧_Java_Apache Spark_Dataframe_Apache Spark Sql - Fatal编程技术网

基于第一个数据帧Java中的列创建具有新列值的新Spark数据帧

基于第一个数据帧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

这应该很容易,但是…使用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 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对不起,我忘了导入。很高兴知道你最后发现了。