当前位置: 首页 > 知识库问答 >
问题:

火花结块中的累积函数

湛宜春
2023-03-14

我尝试过用这个方法来计算累积值,但是如果日期字段与累积字段中的值相同,那么有人能提出类似于这个问题的解决方案吗

val windowval = (Window.partitionBy($"userID").orderBy($"lastModified")
             .rangeBetween(Window.unboundedPreceding, 0))
val df_w_cumsum = ms1_userlogRewards.withColumn("totalRewards", sum($"noOfJumps").over(windowval)).orderBy($"lastModified".asc)
df_w_cumsum.filter($"batchType".isNull).filter($"userID"==="355163").select($"userID", $"noOfJumps", $"totalRewards",$"lastModified").show()

共有2个答案

程鸿畅
2023-03-14

我认为你想用userid和时间戳求和。所以,你需要分区的userid和日期,并使用窗口函数sym如下:

import org.apache.spark.sql.functions.sum
import org.apache.spark.sql.expressions.Window

val window = Window.partitionBy("userID", "lastModified")
df.withColumn("cumulativeSum", sum(col("noOfJumps").over(window))
巩光誉
2023-03-14

请注意,您的第一个totalRewards=147是前一个值49所有时间戳为“2019-08-07 18:25:06”的值的总和:49(36 0 60 2)=147

第一个选项是用相同的时间戳聚合所有值,例如group pBy($"userId",$"lastModify"). agg(sum($"noOfJumps"). as("noOfJumps"))(或类似的东西),然后运行聚合和。这将完全删除重复的时间戳。

第二个选项是使用row_number来定义具有相同lastModify字段的行之间的顺序,然后使用. orderBy($"lastModify,$"row_number")(或类似的东西)运行聚合和。这应该保留所有记录,并在此过程中给你部分总结:总计奖励=49-

 类似资料:
  • 我想在Spark中做累积和。以下是注册表(输入): 配置单元查询: 输出: 使用火花逻辑,我得到相同的输出: 然而,当我在spark cluster上尝试这个逻辑时,的值将是累积和的一半,有时它是不同的。我不知道为什么它会发生在spark cluster上。是因为分区吗? 如何计算spark cluster上一列的累积和?

  • 我有两个不同长度的向量,每个向量包含0到50之间的数字。有些数字在向量中不包含,其他数字可能出现多次。 我想画一条线,显示每个数字在每个向量中包含的频率,即数字的频率。 如果我将中断设置为每个可能的数字之间,我可以绘制显示频率的直方图: 我知道有一个经验累积分布函数(),它会形成一个S形;但我想要的是一个非累积的经验分布函数,它将导致类似阶梯形钟形曲线的结果,类似于直方图的轮廓。 我能得到的最接近

  • 问题内容: 在numpy或scipy(或其他库)中是否有一个函数将cumsum和cumprod的概念推广为任意函数。例如,考虑(理论上的)函数 func是一个接受两个浮点数并返回一个浮点数的函数。特殊情况 和 分别是cumsum和cumprod。例如,如果 我将其应用于: 我想要 问题答案: NumPy的ufunc有: 不幸的是,呼吁在“编Python函数失败,一个奇怪的错误: 这是将NumPy

  • 我尝试使用Spark Streaming并希望有一个全局状态对象,可以在每个批处理后更新。据我所知,至少有两种选择适合我:1。使用,其中Spark将在处理每个批处理后自动更新状态2。使用函数,在这里我必须自己调用更新 类型javapairdStream 中的方法updateStateByKey(Function2 ,optional ,optional >)不适用于参数(new function2

  • 问题内容: 我已经实现了一定数量的所有素数的列表。我试图做的事情很难解释,所以我只用一些硬代码展示一下: 所以从本质上讲,我试图从上一个列表中按顺序取出一个元素,然后按指数倍增,然后将其追加到其他列表中。 我意识到我可以做到这一点,这可能会更容易: 我需要一些想法才能在某种程度上做到这一点。 问题答案: 您需要 累积产品 清单。这是一个简单的食谱: 另一种方法,使用itertools: 或者,也许

  • 问题内容: 如何计算Python中正态分布的累积分布函数(CDF)的反函数? 我应该使用哪个库?可能是卑鄙的? 问题答案: NORMSINV(在注释中提到)是标准正态分布的CDF的倒数。使用,您可以使用对象的方法进行计算。首字母缩写词代表 百分比点函数 ,它是 分位数函数的 另一个名称。 检查它是否与CDF相反: 默认情况下,使用mean = 0和stddev = 1,这是“标准”正态分布。您可以