簡體   English   中英

根據條件獲取第一行

[英]Getting first row based on condition

我有一個數據框,我想在其中的第一行的indicator列為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

因此,帶有1的那些仍將保留,而我第一次獲得每個網絡的指標為0的信息。 我要在執行此操作時按小時降序對所有內容進行排序,因此我得到了最新的0指示器。 我如何去實現這個結果?

這是您所需的代碼,並帶有內聯注釋,也可以幫助您理解:(使用最新數據集更新了輸出,指標列中有多個1)

sourceData.show()

+-------+------+---------+----+
|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|
+-------+------+---------+----+


sourceData.printSchema()

root
  |-- network: string (nullable = true)
  |-- volume: integer (nullable = true)
  |-- indicator: integer (nullable = true)
  |-- Hour: integer (nullable = true)

所需的轉換代碼:

//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|
+-------+------+---------+----+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM