我有一个DataFrame,我想删除第一行和第二行。我该怎么办?
这是我的意见:
+-----+
|value|
+-----+
| 1|
| 4|
| 3|
| 5|
| 4|
| 18|
-------
这是例外结果:
+-----+
|value|
+-----+
| 3|
| 5|
| 4|
| 18|
-------
答案 0 :(得分:3)
在我看来,如果你不能定义数据帧的顺序,那么谈论第一条或第二条记录是没有意义的。作为show
语句的结果,记录的顺序是“任意的”,取决于数据的分区。
假设您有一个可以订购记录的列,您可以使用Window-functions。从这个数据框开始:
+----+-----+
|year|value|
+----+-----+
|2007| 1|
|2008| 4|
|2009| 3|
|2010| 5|
|2011| 4|
|2012| 18|
+----+-----+
你可以做到
import org.apache.spark.sql.expressions.Window
df
.withColumn("rn",row_number().over(Window.orderBy($"year")))
.where($"rn">2).drop($"rn")
.show
答案 1 :(得分:0)
简单易行的方法是为每行分配一个id并对其进行过滤
val df = Seq(1,2,3,5,4,18).toDF("value")
df.withColumn("id", monotonically_increasing_id()).filter($"id" > 1).drop("id")
修改:由于monotonically_increasing_id()
没有连续受助您可以使用zipWithUniqueId
,如下所示
val rows = df.rdd.zipWithUniqueId().map {
case (row, id) => Row.fromSeq(row.toSeq :+ id)
}
val df1 = spark.createDataFrame(rows, StructType(df.schema.fields :+ StructField("id", LongType, false)))
df1.filter($"id" > 1).drop("id")
输出:
+-----+
|value|
+-----+
| 3|
| 5|
| 4|
| 18|
+-----+
这也可以帮助您删除数据框中的第n行。
希望这有帮助!