使用列中值的最后一个外观修剪spark中的数据帧

时间:2018-06-08 21:00:01

标签: scala apache-spark apache-spark-sql

我有数据框,我希望通过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|
+------+----+

2 个答案:

答案 0 :(得分:0)

您可以尝试:

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

答案 1 :(得分:0)

您必须在<script src="{{ mix('js/app.js') }}"></script>列中找到包含Good的最后一行索引,然后仅过滤小于该索引的行。

CUSTID

如果您的PDP列按排序顺序包含增加的ID,则可以执行以下操作

custId

monotically_increasing_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) 没有排序并增加订单,那么您可以使用以下逻辑

custId

我希望答案很有帮助