Spark:根据条件

时间:2018-04-23 05:08:34

标签: apache-spark

对于下面给定的输入df,我试图在spark中输出低于输出df,即添加新列" new1"在输出df和new1列的值是这样的,如果它们小于fn值和id值,它应该包含前面所有行的非值fn列值。

input df:
+---+---+
| id| fn|
+---+---+
|  1|  0|
|  1|  0|
|  2|  0|
|  2|  0|
|  3|  4|
|  5|  0|
|  5|  0|
|  6|  7|
+---+---+

output wanted is:
+---+---+----+
| id| fn|new1|
+---+---+----+
|  1|  0|   4|
|  1|  0|   4|
|  2|  0|   4|
|  2|  0|   4|
|  3|  4|   4|
|  5|  0|   7|
|  5|  0|   7|
|  6|  7|   7|
+---+---+----+

1 个答案:

答案 0 :(得分:0)

感谢您的回复。 我使用了udf(我本来可以使用上面的第一个回复,但因为我有更多的逻辑要合并,因此我使用udf进行简单阅读)。

我所做的代码如下,这对我的问题很好。

val df = Seq((1, 0), (1, 0), (2, 0), (2, 0), (3, 4),(5, 0), (5, 0), (6, 7)).toDF("id", "fn")

        val df1 = df.filter(df("fn") > 0)
        val fn_value_list = df1.select("fn").rdd.map(r => r(0)).collect.toList 
        fn_value_list.foreach(println)

        def udfFunc(idval : Int, fnval : Int) : Int = { 
                for(fn_val_list <- fn_value_list) {
                        if(idval <= fn_val_list.asInstanceOf[Int] &&  fnval <= fn_val_list.asInstanceOf[Int])
                                return fn_val_list.asInstanceOf[Int]
                }   
                return fnval
        }   
        val myUdf = udf(udfFunc _)
        var df10 = df.withColumn("new1", myUdf(df("id"), df("fn")))
        df10.show