仅当超过 5 个大于 0 的值时才选择键和值



下面是在 scala 中使用 Spark 数据帧进行分组和过滤的数据:

+---------------+------+--------+-------+------+------+------+------+------+--------+
|         keys  |num_1 |num_2   |num_3  |num_4 |num_5 |num_6 |num_7 |num_8 |num_9   |
+---------------+------+--------+-------+------+------+------+------+------+--------+
|              1|     0|       0|      0|     0|     0|     0|     0|     0|       0|
|              2|     0|       0|      0|     0|     0|     0|     0|     0|       0|
|              3|     0|     134|      0|     0|    44|   332|     0|   423|     111|
|              4|     0|     338|      0|     0|     0|     0|     0|     0|       0|
|              5|     0|       0|      0|     0|     0|     0|     0|     0|       0|
|              6|     0|       0|      0|     0|     0|     0|     0|     0|       0|
|              7|     0|     130|      4|    11|     0|     5|  1222|     0|       0|
|              8|     0|       1|      0|     0|     0|     0|     0|     0|       2|

从筛选的数据中,是否有一种简单的方法可以仅选择具有超过 5 个值且大于 0 的键?

(例如,只有键 3 和 7 与它们的值一起被选中八个键)

我考虑的唯一方法是单独检查每个值(num_1、num_2,...,num_9),如果它们大于 0,则对变量(例如变量"i")进行增量。 如果检查结束时变量大于 5,请选择带有值的键。但这种方式似乎啰嗦。

使用以下方法创建筛选条件:

df.columns.tail.map(x => when(col(x) > 0, 1).otherwise(0)).reduce(_ + _) >= 5

将大于 0 的值转换为 1,否则转换为 0。然后在所有列中使用 reduce 来计算每行 1 秒。


df.filter(df.columns.tail.map(x => when(col(x) > 0, 1).otherwise(0)).reduce(_ + _) >= 5).show
+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|keys|num_1|num_2|num_3|num_4|num_5|num_6|num_7|num_8|num_9|
+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|   3|    0|  134|    0|    0|   44|  332|    0|  423|  111|
|   7|    0|  130|    4|   11|    0|    5| 1222|    0|    0|
+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

最新更新