python - 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]
我在随后的计算中使用res1
and 。res2
但是,我觉得可以将这两种.over
操作合二为一,减少计算量。Spark 是否足够聪明,可以将其编译掉?
有没有更有效的方法来写这个?
解决方案
如果您不希望单独使用“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()
推荐阅读
- python - python安装speex dsp模块错误
- python - 如何在python中使用正则表达式将子字符串替换为另一个包含该子字符串的字符串
- javascript - 如何在 redis 中找到部分匹配的值并更新它是否已经存在?
- d3.js - 如何控制堆积条形图中 x 轴标签位置的间距?
- maven - Maven Dependency 的依赖
- node.js - Docker 错误:没有这样的文件或目录,打开 '/package.json'
- c++ - 在函数与类/命名空间范围内行为不同的 C++ 宏值
- amazon-web-services - 为什么我无法访问 AWS IAM 列表,尽管我拥有所有 IAM 权限?
- android - Xamarin.Forms Android 对象引用未设置为对象的实例
- ios - IOS/Objective-C:子视图的子视图不显示