aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgatorsmile <gatorsmile@gmail.com>2015-11-19 12:45:04 -0800
committerMichael Armbrust <michael@databricks.com>2015-11-19 12:45:04 -0800
commit276a7e130252c0e7aba702ae5570b3c4f424b23b (patch)
treeb2e18cc0113fad6e98edaa54a8ff15b71fbf7408
parent72d150c271d2b206148fd0917a0def263445121b (diff)
downloadspark-276a7e130252c0e7aba702ae5570b3c4f424b23b.tar.gz
spark-276a7e130252c0e7aba702ae5570b3c4f424b23b.tar.bz2
spark-276a7e130252c0e7aba702ae5570b3c4f424b23b.zip
[SPARK-11633][SQL] LogicalRDD throws TreeNode Exception : Failed to Copy Node
When handling self joins, the implementation did not consider the case insensitivity of HiveContext. It could cause an exception as shown in the JIRA: ``` TreeNodeException: Failed to copy node. ``` The fix is low risk. It avoids unnecessary attribute replacement. It should not affect the existing behavior of self joins. Also added the test case to cover this case. Author: gatorsmile <gatorsmile@gmail.com> Closes #9762 from gatorsmile/joinMakeCopy.
-rw-r--r--sql/core/src/main/scala/org/apache/spark/sql/execution/ExistingRDD.scala4
-rw-r--r--sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala14
2 files changed, 18 insertions, 0 deletions
diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/ExistingRDD.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/ExistingRDD.scala
index 62620ec642..623348f676 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/execution/ExistingRDD.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/ExistingRDD.scala
@@ -74,6 +74,10 @@ private[sql] case class LogicalRDD(
override def children: Seq[LogicalPlan] = Nil
+ override protected final def otherCopyArgs: Seq[AnyRef] = {
+ sqlContext :: Nil
+ }
+
override def newInstance(): LogicalRDD.this.type =
LogicalRDD(output.map(_.newInstance()), rdd)(sqlContext).asInstanceOf[this.type]
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala
index 6399b0165c..dd6d06512f 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala
@@ -1110,6 +1110,20 @@ class DataFrameSuite extends QueryTest with SharedSQLContext {
}
}
+ // This test case is to verify a bug when making a new instance of LogicalRDD.
+ test("SPARK-11633: LogicalRDD throws TreeNode Exception: Failed to Copy Node") {
+ withSQLConf(SQLConf.CASE_SENSITIVE.key -> "false") {
+ val rdd = sparkContext.makeRDD(Seq(Row(1, 3), Row(2, 1)))
+ val df = sqlContext.createDataFrame(
+ rdd,
+ new StructType().add("f1", IntegerType).add("f2", IntegerType),
+ needsConversion = false).select($"F1", $"f2".as("f2"))
+ val df1 = df.as("a")
+ val df2 = df.as("b")
+ checkAnswer(df1.join(df2, $"a.f2" === $"b.f2"), Row(1, 3, 1, 3) :: Row(2, 1, 2, 1) :: Nil)
+ }
+ }
+
test("SPARK-10656: completely support special chars") {
val df = Seq(1 -> "a").toDF("i_$.a", "d^'a.")
checkAnswer(df.select(df("*")), Row(1, "a"))