This is an automated email from the ASF dual-hosted git repository. yamamuro pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push: new f0bde69 [MINOR][SQL] Throw better exception for Encoder with tuple more than 22 elements f0bde69 is described below commit f0bde69ebc086df398405e3836dd8958c725ab7f Author: Jungtaek Lim (HeartSaVioR) <kabh...@gmail.com> AuthorDate: Mon Mar 11 13:44:45 2019 +0900 [MINOR][SQL] Throw better exception for Encoder with tuple more than 22 elements ## What changes were proposed in this pull request? This patch proposes to throw better exception with better error message when encoding to tuple which elements are more than 22. **BEFORE** ```scala scala> import org.apache.spark.sql.catalyst.encoders._ scala> val encoders = (0 to 22).map(_ => org.apache.spark.sql.Encoders.scalaInt.asInstanceOf[ExpressionEncoder[_]]) scala> ExpressionEncoder.tuple(encoders) java.lang.ClassNotFoundException: scala.Tuple23 ``` **AFTER** ```scala scala> ExpressionEncoder.tuple(encoders) java.lang.UnsupportedOperationException: Due to Scala's limited support of tuple, tuple with more than 22 elements are not supported. ``` ## How was this patch tested? Added UT. Closes #24046 from HeartSaVioR/MINOR-throw-better-exception-for-tuple-more-than-22. Authored-by: Jungtaek Lim (HeartSaVioR) <kabh...@gmail.com> Signed-off-by: Takeshi Yamamuro <yamam...@apache.org> --- .../apache/spark/sql/catalyst/encoders/ExpressionEncoder.scala | 6 +++++- .../spark/sql/catalyst/encoders/ExpressionEncoderSuite.scala | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/encoders/ExpressionEncoder.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/encoders/ExpressionEncoder.scala index bcc4896..2799720 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/encoders/ExpressionEncoder.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/encoders/ExpressionEncoder.scala @@ -80,7 +80,11 @@ object ExpressionEncoder { * name/positional binding is preserved. */ def tuple(encoders: Seq[ExpressionEncoder[_]]): ExpressionEncoder[_] = { - // TODO: check if encoders length is more than 22 and throw exception for it. + if (encoders.length > 22) { + throw new UnsupportedOperationException("Due to Scala's limited support of tuple, " + + "tuple with more than 22 elements are not supported.") + } + encoders.foreach(_.assertUnresolved()) val cls = Utils.getContextOrSparkClassLoader.loadClass(s"scala.Tuple${encoders.size}") diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/encoders/ExpressionEncoderSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/encoders/ExpressionEncoderSuite.scala index 1b00506..86e43d7 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/encoders/ExpressionEncoderSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/encoders/ExpressionEncoderSuite.scala @@ -370,6 +370,15 @@ class ExpressionEncoderSuite extends CodegenInterpretedPlanTest with AnalysisTes assert(e.getMessage.contains("Cannot use null as map key")) } + test("throw exception for tuples with more than 22 elements") { + val encoders = (0 to 22).map(_ => Encoders.scalaInt.asInstanceOf[ExpressionEncoder[_]]) + + val e = intercept[UnsupportedOperationException] { + ExpressionEncoder.tuple(encoders) + } + assert(e.getMessage.contains("tuple with more than 22 elements are not supported")) + } + private def encodeDecodeTest[T : ExpressionEncoder]( input: T, testName: String): Unit = { --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org For additional commands, e-mail: commits-h...@spark.apache.org