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

如何在spark中使用窗口函数过滤数据

宁欣怿
2023-03-14

我有以下数据:

rowid uid time code
   1  1      5    a
   2  1      6    b
   3  1      7    c
   4  2      8    a
   5  2      9    c
   6  2      9    c
   7  2     10    c
   8  2     11    a
   9  2     12    c

现在我想以这样一种方式过滤数据,我可以删除第6行和第7行,对于特定的uid,我想在代码中只保留一行值为'c'

所以预期的数据应该是:

rowid uid time code
   1  1      5    a
   2  1      6    b
   3  1      7    c
   4  2      8    a
   5  2      9    c
   8  2     11    a
   9  2     12    c

我使用的窗口函数如下所示:

val window = Window.partitionBy("uid").orderBy("time")
val change = ((lag("code", 1).over(window) <=> "c")).cast("int")

共有1个答案

周睿范
2023-03-14

如果只想删除code=“c”的行(每个uid的第一行除外),可以尝试以下操作:

val window = Window.partitionBy("uid", "code").orderBy("time")
val result = df
  .withColumn("rank", row_number().over(window))
  .where(
    (col("code") !== "c") ||
    col("rank") === 1
  )
  .drop("rank")

根据新信息进行编辑:

val window = Window.partitionBy("uid").orderBy("time")
val result = df
  .withColumn("lagValue", coalesce(lag(col("code"), 1).over(window), lit("")))
  .where(
    (col("code") !== "c") ||
    (col("lagValue") !== "c")
  )
  .drop("lagValue")
 类似资料:
  • 问题内容: 好的,起初这只是和我的一个朋友开玩笑,但后来变成了有趣的技术问题:) 我有下表: 该表包含我所有东西的记录,并分别具有数量和优先级(我需要多少)。 我有一个指定体积的袋子,例如。我想从表中选择所有可以放入袋子的东西,首先包装最重要的东西。 这似乎是使用窗口函数的情况,所以这是我想出的查询: 但是,问题在于Postgres抱怨: 如果我删除此过滤器,则会正确计算总列,对结果进行正确排序,

  • 问题内容: 这是该问题的后续内容,其中对我的查询进行了改进,使其使用窗口函数而不是联接内的聚合。虽然查询现在快得多,但我发现结果不正确。 我需要在x年尾随时间框架上执行计算。例如,每行的计算方法是:十年前移至当前行,然后除以结果。为了简单起见,我们将使用1年。 SQL Fiddle对此问题进行了解答。(Postgres 9.6) 作为一个简单的例子,和用于可像这样分别计算: 要做到这一点 ,每行

  • 本文向大家介绍Angularjs中如何使用filterFilter函数过滤,包括了Angularjs中如何使用filterFilter函数过滤的使用技巧和注意事项,需要的朋友参考一下 AngularJS的filter,中文名“过滤器”是用来过滤变量的值,或者格式化输出,得到自己所期望的结果或格式的东东。AngularJS中有一个filterFilter函数用来对集合过滤,非常方便。 源代码大致如下

  • 我在Scala中查看幻灯片函数中的Spark。

  • 使用https://stackoverflow.com/a/32407543/5379015中提供的解决方案,我尝试重新创建相同的查询,但使用编程语法代替API,如下所示: 第一个工作正常,但是结果是