如果 Spark 中连续值块的前后值相同,如何替换该块?

问题描述 投票:0回答:1

我是 Spark 新手,面临着一个我几天来一直在努力解决的问题。我还没有找到解决方案。 Spark Java 或 Scala 中的答案将不胜感激。我的数据集如下所示。

实例 时间 电源
I1 2024-09-01-00:00:00 电力
I1 2024-09-01-00:15:00 错误
I1 2024-09-01-00:30:00 错误
I1 2024-09-01-00:45:00 错误
I1 2024-09-01-01:00:00 电力
I1 2024-09-01-01:15:00 错误
I1 2024-09-01-01:30:00 电池
I1 2024-09-01-01:45:00 错误
I1 2024-09-01-02:00:00 电池

现在,如果错误块下方和上方的值相同,那么我想用该值替换所有错误。另外,替换操作应该通过对Instance进行分区来完成。所以我的输出应该如下所示。

实例 时间 电源
I1 2024-09-01-00:00:00 电力
I1 2024-09-01-00:15:00 电力
I1 2024-09-01-00:30:00 电力
I1 2024-09-01-00:45:00 电力
I1 2024-09-01-01:00:00 电力
I1 2024-09-01-01:15:00 错误<-- value above and below this is not same, hence not replaced
I1 2024-09-01-01:30:00 电池
I1 2024-09-01-01:45:00 电池
I1 2024-09-01-02:00:00 电池

然后我想找到每个实例的每个电源的总计数、最大和最小连续计数。所以从上面的输出来看应该是: 电力 -> 总计数:5,最大连续数:5,最小连续数:5 电池 -> 总计数:3,最大连续次数:3,最小连续次数:3

我无法解决第一部分,但对于第二部分(查找计数),我计划在每个实例的列表中收集 power_source ,然后将其传递给 UDF 以查找计数。

java scala apache-spark apache-spark-sql
1个回答
0
投票

我能想到的一种方法是使用带有自定义函数的 groupby 来对分组值进行操作。

  1. 您将按实例分组并按时间排序。
  2. 将分组数据发送到函数,该函数可以迭代电源的值。
  3. 在对值的第一次迭代中,我们必须确定错误块是否在相同的值内。您可以使用数组函数轻松完成此操作。
  4. 如果是,您只需迭代这些值,并用包含错误值的任何内容更新所有错误值。

我知道这不是最好的方法,但根据我的经验,这应该可行。如果我想到什么就会更新。

© www.soinside.com 2019 - 2024. All rights reserved.