如何通过火花计算有条件的字段

how to count field with condition by spark

我有一个数据框,有一个名为 A 的枚举字段(值为 0 或 1),另一个字段 B,我想实现以下场景:

if `B` is null:
   count(when `A` is 0) and set a column name `xx` 
   count(when `A` is 1) and set a column name `yy` 
if `B` is not null:
   count(when `A` is 0) and set a column name `zz` 
   count(when `A` is 1) and set a column name `mm` 

spark scala 怎么实现?

可以通过这种方式有条件地填充列,但是最终输出的 DataFrame 需要预期的架构。

假设您详述的所有场景都可以在一个 DataFrame 中实现,我建议创建四列中的每一列:"xx""yy""zz""mm"有条件地填充它们

在下面的示例中,我使用 "found""" 填充了值,主要是为了便于查看值的填充位置。在此处使用 truefalse 或其他枚举可能在现实世界中更有意义。

从 DataFrame 开始(因为你没有指定 "B" 的类型,我已经为这个例子选择了 Option[String] (可为空):

val df = List(
    (0, None),
    (1, None),
    (0, Some("hello")),
    (1, Some("world"))
).toDF("A", "B")
     
 df.show(false)

给出:

+---+-----+
|A  |B    |
+---+-----+
|0  |null |
|1  |null |
|0  |hello|
|1  |world|
+---+-----+

并创建列:

df
    .withColumn("xx", when(col("B").isNull && col("A") === 0, "found").otherwise(""))
    .withColumn("yy", when(col("B").isNull && col("A") === 1, "found").otherwise(""))
    .withColumn("zz", when(col("B").isNotNull && col("A") === 0, "found").otherwise(""))
    .withColumn("mm", when(col("B").isNotNull && col("A") === 1, "found").otherwise(""))
    .show(false)

给出:

+---+-----+-----+-----+-----+-----+
|A  |B    |xx   |yy   |zz   |mm   |
+---+-----+-----+-----+-----+-----+
|0  |null |found|     |     |     |
|1  |null |     |found|     |     |
|0  |hello|     |     |found|     |
|1  |world|     |     |     |found|
+---+-----+-----+-----+-----+-----+