我有一个DataFrame
,我想添加一个新的column
,但不是基于退出列,我该怎么办?
这是我的数据框:
+----+
|time|
+----+
| 1|
| 4|
| 3|
| 2|
| 5|
| 7|
| 3|
| 5|
+----+
这是我期望的结果:
+----+-----+
|time|index|
+----+-----+
| 1| 1|
| 4| 2|
| 3| 3|
| 2| 4|
| 5| 5|
| 7| 6|
| 3| 7|
| 5| 8|
+----+-----+
答案 0 :(得分:1)
使用rdd zipWithIndex可能就是你想要的。
val newRdd = yourDF.rdd.zipWithIndex.map{case (r: Row, id: Long) => Row.fromSeq(r.toSeq :+ id)}
val schema = StructType(Array(StructField("time", IntegerType, nullable = true), StructField("index", LongType, nullable = true)))
val newDF = spark.createDataFrame(newRdd, schema)
newDF.show
+----+-----+
|time|index|
+----+-----+
| 1| 0|
| 4| 1|
| 3| 2|
| 2| 3|
| 5| 4|
| 7| 5|
| 3| 6|
| 8| 7|
+----+-----+
我假设您的时间列是IntegerType。
答案 1 :(得分:0)
使用Window function
并转换为rdd
并使用zipWithIndex
的速度较慢,您可以使用内置函数monotonically_increasing_id
作为
import org.apache.spark.sql.functions._
df.withColumn("index", monotonically_increasing_id())
希望这个肝脏!
答案 2 :(得分:-1)