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

复制当前行或滞后行

鲁涵意
2023-03-14

我有表1

number  type   time
--------------------
1       on     1
1       on     5
1       off    10
1       off    15

我需要将其转换为表2

number  type   time    
--------------------
1       on     1
1       off    2
1       on     5
1       off    10
1       on     14
1       off    15

条件是如果<code>$“类型”===“打开”

我找到了应该复制的行

val window = Window.partitionBy($"number").orderBy($"time")
df
.withColumn("lag_type", lag($"type", 1, null).over(window))
.withColumn("lag1", $"type" === "ON" && $"lag_type" =!= "OFF")
.withColumn("lag2", $"type" =!= "ON" && $"lag_type" === "OFF")

但不知道如何添加行。特别是如果它们基于滞后值。对于当前的一个,我可能会列出列表

type       time
(on, off)  (14, 15)

并像在这里展示的那样爆炸它们,但是当涉及到滞后行时,我又迷失了。

有什么建议吗?我正在使用火花2.2。案例类可以吗?

共有1个答案

董康平
2023-03-14

如果我正确理解了您的问题,那么您只想为以下情况添加行:lag1lag2true

一种方法是:

//Filter only the rows that needs to be changed : 

val df2 = df.withColumn("lag_type", lag($"type", 1, null).over(window))
.withColumn("lag1", $"type" === "ON" && $"lag_type" =!= "OFF")
.withColumn("lag2", $"type" =!= "ON" && $"lag_type" === "OFF")
.filter( $"lag1"|| $"lag2")

 
//Change the rows based on the values of lag1 and lag2 
//then drop extra columns

val newChangedDf = df2
.withColumn("time",when($"lag1", $"time"+1).otherwise($"time"-1))
.withColumn("type",when($"lag1", lit("OFF")).otherwise(lit("ON")))
.drop("lag_type","lag1","lag2")

//Finally add them to the original df. 

val finalDf = df.union(newChangedDf)

注意:这不处理lag1和lag2都< code>true的情况。请根据您的要求操作上述代码。

 类似资料:
  • 我想将当前行复制到它下面的新行。我找到了这篇文章,但在options>键盘中找不到他们谈论的选项()。 2017年我们如何做到这一点?

  • 我是VSCode编辑器的新手。 以前使用atom时,将光标放在行尾并按Ctrl C键将复制该行。将光标放在另一行的末尾,然后按Ctrl V键将其粘贴到该行的下面。 似乎在VSCode中,我可以以相同的方式复制一行,但当我以相同的方式粘贴时,它会将该行放在所选行上方。当我的光标位于行尾时,这似乎非常违反直觉。 有什么地方可以改变这个的设置吗? 编辑:我没有试图复制一行。我想复制一行并粘贴到另一个文件

  • 我们的应用程序使用Amazon RDS Aurora的reader和writer实例。AWS仪表板显示副本延迟持续约为20ms。然而,我们在阅读器上看到的旧结果是在主机上提交后90ms以上,在某些情况下至少高达170ms。 当执行CRUD操作时,我们的应用程序提交数据,然后向客户端发出HTTP重定向以加载新数据。重定向时的网络周转记录在客户端上,通常至少为90ms。我们正在记录应用服务器上的提交时

  • 我想“创建或替换”postgres表的触发器。但是,没有这样的sql表达式。 我看到我可以先执行“

  • 问题内容: 伙计们,我想在mysql中使用解析函数滞后。在Oracle中受支持,但在Mysql中无法做到。那么有人可以帮助我如何在Mysql中执行滞后运算吗?例如 我想使用滞后函数,以便我的输出如下 Mysql支持滞后功能吗??? 问题答案: 您可以使用用户变量来模拟它: 看到它在工作sqlfiddle直播 在这里,您可以初始化变量。这与在编写查询之前编写内容相同。 那么这些语句在select子句