首页 > 解决方案 > Spark dataframe 多维数据集操作给出重复的行

问题描述

我正在对具有接近 100 万行的 spark 数据帧进行计数聚合的多维数据集操作。我正在使用 4 列来执行此多维数据集操作。我注意到多维数据集操作后返回的数据帧有重复的行。特别适用于空组合。

我的输入 DF 中没有空值,因为在执行多维数据集操作之前,我已经用每列的单独默认值替换了所有空值。此外,我过滤掉了多维数据集输出的行,其中所有 3 个分组列都为空,因为这代表总数,我已经意识到这一点。

一个例子可能是:

val dimensions = List("A","B","C","D")
   
    val cube_df = input_df.cube(dimensions.head, dimensions.tail: _*)
   .count()
   .filter(!(col("A").isNull  && col("B").isNull && col("C").isNull && col("D").isNull))

现在,如果像这样在立方体上表演:

   cube_df
    .filter(col("A").isNull && col("B").isNull && col("C").isNull && col("D") === "xyz")
    .show(false)

+----+----+----+---------------+-----------+
|A   |B   |C   |D              |Count      |
+----+----+----+---------------+-----------+
|null|null|null|xyz            |10221      |
|null|null|null|xyz            |232638     |
+----+----+----+---------------+-----------+

我在输出中看到两行,显然这些行中只有 1 行表示根据 input_df 的正确计数(在我的例子中是第二行)。

我也知道,多维数据集基本上对所有组合 1 比 1 进行分组,将任何组合中的非参与列保持为空,并继续为每个组合分组执行 union_all 操作。但这对我来说仍然有点奇怪。

那么为什么会这样呢?如果我不能避免这种重复的组合输出,那么我如何识别返回的组合中的哪个代表正确的输出?

标签: apache-sparkaggregate-functions

解决方案


推荐阅读