如何使用Scala / Spark添加不基于数据框中存在列的新列?

时间:2017-07-21 03:05:22

标签: apache-spark apache-spark-sql

我有一个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|  
+----+-----+  

3 个答案:

答案 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)

您可以使用Window函数spark生成行号。

import org.apache.spark.sql.expressions.Window
df.withColumn("index",row_number().over(Window.orderBy($"time")))

您可以从here

了解有关窗口功能的更多信息