diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/types/StructType.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/types/StructType.scala index 0205c13aa986..c1310308c44b 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/types/StructType.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/types/StructType.scala @@ -18,6 +18,7 @@ package org.apache.spark.sql.types import scala.collection.mutable.ArrayBuffer +import scala.util.control.NonFatal import scala.util.Try import org.json4s.JsonDSL._ @@ -468,10 +469,16 @@ object StructType extends AbstractDataType { leftFields.foreach { case leftField @ StructField(leftName, leftType, leftNullable, _) => rightMapped.get(leftName) - .map { case rightField @ StructField(_, rightType, rightNullable, _) => - leftField.copy( - dataType = merge(leftType, rightType), - nullable = leftNullable || rightNullable) + .map { case rightField @ StructField(rightName, rightType, rightNullable, _) => + try { + leftField.copy( + dataType = merge(leftType, rightType), + nullable = leftNullable || rightNullable) + } catch { + case NonFatal(e) => + throw new SparkException(s"Failed to merge fields '$leftName' and " + + s"'$rightName'. " + e.getMessage) + } } .orElse { optionalMeta.putBoolean(metadataKeyForOptionalField, value = true) diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/types/DataTypeSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/types/DataTypeSuite.scala index b8ab9a9963de..efb104299f0e 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/types/DataTypeSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/types/DataTypeSuite.scala @@ -189,9 +189,11 @@ class DataTypeSuite extends SparkFunSuite { val right = StructType( StructField("b", LongType) :: Nil) - intercept[SparkException] { + val message = intercept[SparkException] { left.merge(right) - } + }.getMessage + assert(message.equals("Failed to merge fields 'b' and 'b'. " + + "Failed to merge incompatible data types FloatType and LongType")) } test("existsRecursively") {