Scala 基于条件获取第一行

Scala 基于条件获取第一行,scala,apache-spark,Scala,Apache Spark,我有一个数据帧,我想在其中获取第一行,其中指示符列为0。例如,我的数据框如下所示: network volume indicator Hour YYY 20 1 10 YYY 30 0 9 YYY 40 0 8 YYY 80 1 7 TTT 50 0 10 TTT 40

我有一个数据帧,我想在其中获取第一行,其中
指示符
列为0。例如,我的数据框如下所示:

network   volume  indicator  Hour
YYY       20      1          10
YYY       30      0          9
YYY       40      0          8
YYY       80      1          7

TTT       50      0          10
TTT       40      1          8
TTT       10      0          4
TTT       10      1          2
network   volume  indicator  Hour
YYY       20      1          10
YYY       30      0          9
YYY       80      1          7

TTT       50      0          10
TTT       40      1          8
TTT       10      1          2
结果应该如下所示:

network   volume  indicator  Hour
YYY       20      1          10
YYY       30      0          9
YYY       40      0          8
YYY       80      1          7

TTT       50      0          10
TTT       40      1          8
TTT       10      0          4
TTT       10      1          2
network   volume  indicator  Hour
YYY       20      1          10
YYY       30      0          9
YYY       80      1          7

TTT       50      0          10
TTT       40      1          8
TTT       10      1          2

因此,带有1的网络仍然会保留,而我第一次得到每个网络的指标为0。当我这样做的时候,我希望所有的东西都按小时降序排列,所以我得到了最近的0指标。如何实现此结果?

以下是您所需的代码,并附带注释以帮助您理解:(使用最新的数据集更新输出,指标列中有多个1)

所需的转换代码:

//splitting your data set into two parts with indicator 1 and 0
val indicator1Df = sourceData.filter("indicator == 1")
val indicator0Df = sourceData.filter("indicator == 0")

//getting the first row for all indicator=0
indicator0Df.createOrReplaceTempView("indicator0")
val firstIndicator0df = spark.sql("select network, volume, indicator, hour from (select i0.network,i0.volume,i0.indicator,i0.hour,ROW_NUMBER() over (partition by i0.network order by i0.Hour desc) as rnk from indicator0 i0) i where rnk = 1")

//merging both the dataframes back to for your required output result
val finalDf = indicator1Df.union(firstIndicator0df).orderBy($"network".desc,$"Hour".desc)

finalDf.show()
最终输出:

+-------+------+---------+----+
|network|volume|indicator|Hour|
+-------+------+---------+----+
|    YYY|    20|        1|  10|
|    YYY|    30|        0|   9|
|    YYY|    80|        1|   7|
|    TTT|    50|        0|  10|
|    TTT|    40|        1|   8|
|    TTT|    10|        1|   2|
+-------+------+---------+----+

您是否尝试过使用变量存储状态的简单循环(无论最后看到的值是0还是1)?如果同一网络有多个1怎么办?@ShankarKoirala如果同一网络有多个1,那么它应该仍然保持在那里。因此,我们将拥有除前0之外的所有1。我更新了我的问题,有没有一种方法可以不用spark sql来回答您的问题,比如使用spark orm?您的意思是说使用spark Scala数据帧函数?val firstIndicator0df=Window.partitionBy($“network”).orderBy($“hour”.desc)val first0ind=indicator0.select($“network”、$“volume”、$“indicator”、$“hour”、$“hour”、row_number()。结束(窗口).as(“rnk”)。其中($“rnk”==1)。选择($“网络”,“卷”,“指标”,“小时”)