首页 > 解决方案 > pyspark:如何简化两个 .over 操作?

问题描述

我的代码看起来像

windowval = (Window.orderBy('colOrder').rangeBetween(Window.unboundedPreceding, 0))

dataframe.withColumn('a', F.sum(F.col('colA')).over(windowval)).\
          withColumn('b', F.sum(F.col('colB')).over(windowval)).\
          withColumn('aoverb', F.col('a')/F.col('b')).cache()

res1 = dataframe.agg(F.max('aoverb')).collect()[0][0]
res2 = dataframe.where(F.col('aoverb') == max_ratio).collect()[0]

我在随后的计算中使用res1and 。res2

但是,我觉得可以将这两种.over操作合二为一,减少计算量。Spark 是否足够聪明,可以将其编译掉?

有没有更有效的方法来写这个?

标签: pythonpyspark

解决方案


如果您不希望单独使用“a”或“b”,我相信您可以将所有这些逻辑放在“aoverb”列中。

windowval = (Window.orderBy('colOrder').rangeBetween(Window.unboundedPreceding, 0))

dataframe.withColumn(
    'aoverb', 
    F.sum(F.col('colA')).over(windowval)/F.sum(F.col('colB')).over(windowval)
).cache()

推荐阅读