簡體   English   中英

使用列中最后出現的值修剪Spark中的數據框

[英]trim dataframe in spark using last appearance of value in the column

我有要在列PDP中按值Good的最后出現修剪的數據框。 這是要考慮第5行及以下行。 第5行以上的任何內容都沒有關系。

+------+----+
|custId| PDP|
|  1001| New|
|  1002|Good|
|  1003| New| 
|  1004| New|
|  1005|Good|
|  1006| New|
|  1007| New|
|  1008| New|
|  1009| New|
+------+----+

我需要的是這個數據框。 自上次Good行動發生在第5行

+------+----+
|custId| PDP|
|  1001| New|
|  1002|Good|
|  1003| New| 
|  1004| New|
|  1005|Good|
+------+----+

你可以試試:

df
  .filter($"PDP" === "Good")             // Filter good
  .select(max("custId").alias("maxId"))  // Find max id
  .crossJoin(df)
  .where($"custId" <= $"maxId")          // Filter records with id <= lastGoodId
  .drop("maxId")                         // Remove obsolete column

您必須在PDP列中找到“ Good的最后一行索引,然后僅過濾小於該索引的行。

客戶編號

如果您的custId列包含按排序順序遞增的ID,則可以執行以下操作

import org.apache.spark.sql.functions._
val maxIdToFilter = df.filter(lower(col("PDP")) === "good").select(max(col("custId").cast("long"))).first().getLong(0)
df.filter(col("custId") <= maxIdToFilter).show(false)

monotically_increasing_id

如果您的custId沒有排序和升序,則可以使用以下邏輯

import org.apache.spark.sql.functions._
val dfWithRow = df.withColumn("rowNo", monotonically_increasing_id())
val maxIdToFilter = dfWithRow.filter(lower(col("PDP")) === "good").select(max("rowNo")).first().getLong(0)
dfWithRow.filter(col("rowNo") <= maxIdToFilter).drop("rowNo").show(false)

我希望答案是有幫助的

暫無
暫無

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

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