如何使用每列值的不同窗口规范?

时间:2017-11-20 07:58:59

标签: apache-spark spark-dataframe apache-spark-dataset

这是我的partitionBy条件,我需要根据数据框中的列值进行更改。

val windowSpec = Window.partitionBy("col1", "clo2","clo3").orderBy($"Col5".desc) 

现在,如果数据框中的一列(col6)的值是I,那么上面的条件。

但是当列(col6)的值改变O然后低于条件

val windowSpec = Window.partitionBy("col1","clo3").orderBy($"Col5".desc)

我如何在火花数据框中实现它。

因此对于每个记录来说,它将根据将应用的partitionBy条件检查col6是I还是O

1 个答案:

答案 0 :(得分:1)

鉴于需要根据col6列的值选择最终窗口规范,我先做filter,然后再进行最终窗口聚合。

scala> dataset.show
+----+----+----+----+----+
|col1|col2|col3|col5|col6|
+----+----+----+----+----+
|   0|   0|   0|   0|   I| // <-- triggers 3 columns to use
|   0|   0|   0|   0|   O| // <-- the aggregation should use just 2 columns
+----+----+----+----+----+

使用上述数据集,我filter看看I中是否至少有一个col6并应用窗口规范。

val windowSpecForIs = Window.partitionBy("col1", "clo2","clo3").orderBy($"Col5".desc)
val windowSpecForOs = Window.partitionBy("col1","clo3").orderBy($"Col5".desc)

val noIs = dataset.filter($"col6" === "I").take(1).isEmpty
val windowSpec = if (noIs) windowSpecForOs else windowSpecForIs