如何根据多个条件更新行

时间:2017-07-05 10:48:53

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

我有一个df

+------+-------+-----+
|values|percent|ecpc |
+------+-------+-----+
|  010 |  0.11 |    5|
|  100 |  0.22 |    4|
|  001 |  0.33 |    3|
|  011 |  0.01 |    5|
|  101 |  0.005|    4|
|  110 |  0.11 |    3|
|  000 |  0.21 |    5|
|  111 |0.0001 |    4|
+------+-------+-----+

如果为< 0.01%,我想将1中的值更改为0。 AND更改百分比> 0.01,将ecpc更改为新的ecpc。

EX:对于值111,百分比<0.01,将1中的一个更改为0,如101, 仍为百分之< 0.01,更改其他1,如110,百分比>0.010.11, 更改另一个1,如011,百分比>0.01为0.01。 0.01 <0.11。 在values = 111时将ecpc更新为5。

最终DF如:

+------+-------+-----+------+
|values|percent|ecpc |change|
+------+-------+-----+------+
|  010 |  0.11 |    5|     0|
|  100 |  0.22 |    4|     0|
|  001 |  0.33 |    3|     0|
|  011 |  0.01 |    5|     0|
|  101 |  0.005|    5|     1|
|  110 |  0.11 |    3|     0|
|  000 |  0.21 |    5|     0|
|  111 |0.0001 |    3|     1|
+------+-------+-----+------+

1 个答案:

答案 0 :(得分:1)

我们假设你想在一个条件下更新一行(例如,当百分比<0.11时,更改= 1,否则为0)。你会做这样的事情:

val newDF = df.withColumn("change", when($"percent" < 0.11, lit(1)).otherwise(lit(0))

当您进行额外更改时,只需将它们链接起来:

val newDFCombined = newDF.withColumn("ecpc", when($"percent" < 0.11, myFunc1($"values").otherwise(myFunc2($"values"))))

其中myFunc1和MyFunc2是计算所需值的函数。