【问题标题】:doing some of columns based on some complex logic in pyspark在 pyspark 中根据一些复杂的逻辑做一些列
【发布时间】:2020-11-07 01:36:18
【问题描述】:

这是附图中的问题:

表:

Row Col1    Col2    Col3    Result
1   10       20      100    30
2   20       40      200    60
3   30       60       0     240
4   40       70       0     180
5   30       80      50     110
6   25       35       0      65
7   10       20      60      30

所以结果列是根据以下规则计算的:

  1. 如果 col3 >0 ,则 result=col1+col2
  2. 如果 col 3=0,则 result= sum (col2) until col3 >0 + col1(where col3>0)

例如对于第 3 行,结果=60+70+80+30(来自第 5 行的 col1,因为这里 col3>0)=240 对于第 4 行,结果=70+80+30(来自第 5 行的 col1,因为这里 col3>0)=180 其他人也一样

【问题讨论】:

    标签: sql pandas apache-spark pyspark apache-spark-sql


    【解决方案1】:

    这回答(正确,我可能会添加)问题的原始版本。

    在 SQL 中,您可以使用窗口函数来表达这一点。使用累积和来定义组和额外的累积和:

    select t.*,
           (case when col3 <> 0 then col1 + col2
                 else sum(col2 + case when col3 = 0 then col1 else 0 end) over (partition by grp order by row desc)
            end) as result
    from (select t.*,
                 sum(case when col3 <> 0 then 1 else 0 end) over (order by row desc) as grp
          from t
         ) t;
    

    Here 是一个 dbfiddle(使用 Postgres)。

    注意:

    您的描述表明else 逻辑应该是:

    else sum(col2) over (partition by grp order by row desc)
    

    你的例子说:

    else sum(col2 + col3) over (partition by grp order by row desc)
    

    在我看来,这似乎是最合乎逻辑的:

    else sum(col1 + col2) over (partition by grp order by row desc)
    

    【讨论】:

    • 如果您看到第 3 行的表格,我们的计算方式如下:因为 col 3 =0 所以它将是 sum(col2) 直到 col3>0 所以它将等于 (60+70+ 80) 并且 col1 将与 col3>0 相加,因此总和将类似于 (60+70+80+50)
    • @MradulGupta 。 . .正如 SQL Fiddle 所示,结果正是您指定的。 Note 只是对计算的评论。
    • 您用于 sum 的 50 值将来自 col1 而不是 col3 ......这就是困难所在
    • @MradulGupta 。 . .不,它来自col3。表达式为sum(col2 + **col3**) over (partition by grp order by row desc)
    • 是的,你是对的....你是从 col3 获取它......但我需要它来自 col1.......逻辑是 - (一旦我们得到> col3 中的 0 值,然后 col1 中的值将用于求和
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多