Skip to content

Commit 7dc4965

Browse files
committed
[SPARK-5639][SQL] Support DataFrame.renameColumn.
Author: Reynold Xin <[email protected]> Closes apache#4410 from rxin/df-renameCol and squashes the following commits: a6a796e [Reynold Xin] [SPARK-5639][SQL] Support DataFrame.renameColumn.
1 parent 6d3b7cb commit 7dc4965

File tree

4 files changed

+39
-1
lines changed

4 files changed

+39
-1
lines changed

sql/core/src/main/scala/org/apache/spark/sql/DataFrame.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ private[sql] object DataFrame {
3636

3737

3838
/**
39-
* A collection of rows that have the same columns.
39+
* :: Experimental ::
40+
* A distributed collection of data organized into named columns.
4041
*
4142
* A [[DataFrame]] is equivalent to a relational table in Spark SQL, and can be created using
4243
* various functions in [[SQLContext]].
@@ -72,6 +73,7 @@ private[sql] object DataFrame {
7273
* }}}
7374
*/
7475
// TODO: Improve documentation.
76+
@Experimental
7577
trait DataFrame extends RDDApi[Row] {
7678

7779
val sqlContext: SQLContext
@@ -425,6 +427,11 @@ trait DataFrame extends RDDApi[Row] {
425427
*/
426428
def addColumn(colName: String, col: Column): DataFrame
427429

430+
/**
431+
* Returns a new [[DataFrame]] with a column renamed.
432+
*/
433+
def renameColumn(existingName: String, newName: String): DataFrame
434+
428435
/**
429436
* Returns the first `n` rows.
430437
*/

sql/core/src/main/scala/org/apache/spark/sql/DataFrameImpl.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,14 @@ private[sql] class DataFrameImpl protected[sql](
238238
select(Column("*"), col.as(colName))
239239
}
240240

241+
override def renameColumn(existingName: String, newName: String): DataFrame = {
242+
val colNames = schema.map { field =>
243+
val name = field.name
244+
if (name == existingName) Column(name).as(newName) else Column(name)
245+
}
246+
select(colNames :_*)
247+
}
248+
241249
override def head(n: Int): Array[Row] = limit(n).collect()
242250

243251
override def head(): Row = head(1).head

sql/core/src/main/scala/org/apache/spark/sql/IncomputableColumn.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ private[sql] class IncomputableColumn(protected[sql] val expr: Expression) exten
108108

109109
override def addColumn(colName: String, col: Column): DataFrame = err()
110110

111+
override def renameColumn(existingName: String, newName: String): DataFrame = err()
112+
111113
override def head(n: Int): Array[Row] = err()
112114

113115
override def head(): Row = err()

sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,27 @@ class DataFrameSuite extends QueryTest {
313313
)
314314
}
315315

316+
test("addColumn") {
317+
val df = testData.toDataFrame.addColumn("newCol", col("key") + 1)
318+
checkAnswer(
319+
df,
320+
testData.collect().map { case Row(key: Int, value: String) =>
321+
Row(key, value, key + 1)
322+
}.toSeq)
323+
assert(df.schema.map(_.name).toSeq === Seq("key", "value", "newCol"))
324+
}
325+
326+
test("renameColumn") {
327+
val df = testData.toDataFrame.addColumn("newCol", col("key") + 1)
328+
.renameColumn("value", "valueRenamed")
329+
checkAnswer(
330+
df,
331+
testData.collect().map { case Row(key: Int, value: String) =>
332+
Row(key, value, key + 1)
333+
}.toSeq)
334+
assert(df.schema.map(_.name).toSeq === Seq("key", "valueRenamed", "newCol"))
335+
}
336+
316337
test("apply on query results (SPARK-5462)") {
317338
val df = testData.sqlContext.sql("select key from testData")
318339
checkAnswer(df("key"), testData.select('key).collect().toSeq)

0 commit comments

Comments
 (0)