diff --git a/sql/core/src/main/scala/org/apache/spark/sql/Column.scala b/sql/core/src/main/scala/org/apache/spark/sql/Column.scala
index a2cc9a9b93eb81aed0a107aa5a273a9d01f879d4..908c78a4d3f10f8e143654ed2800b42e199faa0f 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/Column.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/Column.scala
@@ -59,6 +59,13 @@ class Column(protected[sql] val expr: Expression) {
 
   override def toString: String = expr.prettyString
 
+  override def equals(that: Any) = that match {
+    case that: Column => that.expr.equals(this.expr)
+    case _ => false
+  }
+
+  override def hashCode: Int = this.expr.hashCode
+
   /**
    * Unary minus, i.e. negate the expression.
    * {{{
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/ColumnExpressionSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/ColumnExpressionSuite.scala
index 37c02aaa5460b1492f16e66bca4c69bd92579019..3036fbc05d021a2e24f883574d5b48b87cfc1185 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/ColumnExpressionSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/ColumnExpressionSuite.scala
@@ -313,4 +313,9 @@ class ColumnExpressionSuite extends QueryTest {
   test("lift alias out of cast") {
     assert(col("1234").as("name").cast("int").expr === col("1234").cast("int").as("name").expr)
   }
+
+  test("columns can be compared") {
+    assert('key.desc == 'key.desc)
+    assert('key.desc != 'key.asc)
+  }
 }