pyspark:如何基于同一ID的其他列修改列值

时间:2019-03-24 19:51:36

标签: pyspark

我有一个包含5列的pyspark数据框:Id,值X,X的上下限和更新日期(此数据框由“ Id,更新”排序)。我是从蜂巢表中读取的:

(spark.sql(Select *from table1 ordered by Update))

    +---+----------+----------+----------+----------+
    | Id|         X|        LB|        UB|    Update|
    +---+----------+----------+----------+----------+
    |  1|2019-01-20|2019-01-15|2019-01-25|2019-01-02|
    |  1|2019-01-17|2019-01-15|2019-01-25|2019-01-03|
    |  1|2019-01-10|2019-01-15|2019-01-25|2019-01-05|
    |  1|2019-01-12|2019-01-15|2019-01-25|2019-01-07|
    |  1|2019-01-15|2019-01-15|2019-01-25|2019-01-08|
    |  2|2018-12-12|2018-12-07|2018-12-17|2018-11-17|
    |  2|2018-12-15|2018-12-07|2018-12-17|2018-11-18|

当“ X”小于“ LB”或大于“ UB”时,将根据X以及随后的所有具有相同ID的行重新计算“ LB”和“ UB”。

    if(X<LB | X>UB) LB = X-5 (in days)
                    UB = X+5 (in days)

结果应该是这样的:

    +---+----------+----------+----------+----------+
    | Id|         X|        LB|        UB|    Update|
    +---+----------+----------+----------+----------+
    |  1|2019-01-20|2019-01-15|2019-01-25|2019-01-02|
    |  1|2019-01-17|2019-01-15|2019-01-25|2019-01-03|
    |  1|2019-01-10|2019-01-05|2019-01-15|2019-01-05|
    |  1|2019-01-12|2019-01-05|2019-01-15|2019-01-07|
    |  1|2019-01-15|2019-01-05|2019-01-15|2019-01-08|
    |  2|2018-12-12|2018-12-07|2018-12-17|2018-11-17|
    |  2|2018-12-15|2018-12-07|2018-12-17|2018-11-18|

第三,第四和第五行已更改。 如何实现呢?

1 个答案:

答案 0 :(得分:0)

在“选择表达式”中尝试Case语句-

df.selectExpr("Id AS Id",
              "X AS X",
              "CASE WHEN X<LB OR X>UB THEN date_sub(X,5) ELSE LB END AS LB",
              "CASE WHEN X<LB OR X>UB THEN date_add(X,5) ELSE UB END AS UB",
              "Update AS Update").show()