You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by we...@apache.org on 2022/05/06 09:39:19 UTC
[spark] branch master updated: [SPARK-39012][SQL] SparkSQL cast partition value does not support all data types
This is an automated email from the ASF dual-hosted git repository.
wenchen 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 08c07a17717 [SPARK-39012][SQL] SparkSQL cast partition value does not support all data types
08c07a17717 is described below
commit 08c07a17717691f931d4d3206dd0385073f5bd08
Author: Rui Wang <ru...@databricks.com>
AuthorDate: Fri May 6 17:38:59 2022 +0800
[SPARK-39012][SQL] SparkSQL cast partition value does not support all data types
### What changes were proposed in this pull request?
Add binary type support for schema inference in SparkSQL.
### Why are the changes needed?
Spark does not support binary and boolean types when casting partition value to a target type. This PR adds the support for binary and boolean.
### Does this PR introduce _any_ user-facing change?
No. This is more like fixing a bug.
### How was this patch tested?
UT
Closes #36344 from amaliujia/inferbinary.
Authored-by: Rui Wang <ru...@databricks.com>
Signed-off-by: Wenchen Fan <we...@databricks.com>
---
.../execution/datasources/PartitioningUtils.scala | 2 ++
.../scala/org/apache/spark/sql/SQLQuerySuite.scala | 30 ++++++++++++++++++++--
2 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/PartitioningUtils.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/PartitioningUtils.scala
index 8d71cf65807..166fc852899 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/PartitioningUtils.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/PartitioningUtils.scala
@@ -545,6 +545,8 @@ object PartitioningUtils extends SQLConfHelper{
}
case it: AnsiIntervalType =>
Cast(Literal(unescapePathName(value)), it).eval()
+ case BinaryType => value.getBytes()
+ case BooleanType => value.toBoolean
case dt => throw QueryExecutionErrors.typeUnsupportedError(dt)
}
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
index fe8467c8d82..48f448df6cf 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
@@ -24,12 +24,14 @@ import java.time.{Duration, Period}
import java.util.Locale
import java.util.concurrent.atomic.AtomicBoolean
+import scala.collection.mutable
+
import org.apache.commons.io.FileUtils
import org.apache.spark.{AccumulatorSuite, SparkException}
import org.apache.spark.scheduler.{SparkListener, SparkListenerJobStart}
import org.apache.spark.sql.catalyst.analysis.FunctionRegistry
-import org.apache.spark.sql.catalyst.expressions.GenericRow
+import org.apache.spark.sql.catalyst.expressions.{GenericRow, Hex}
import org.apache.spark.sql.catalyst.expressions.aggregate.{Complete, Partial}
import org.apache.spark.sql.catalyst.optimizer.{ConvertToLocalRelation, NestedColumnAliasingSuite}
import org.apache.spark.sql.catalyst.plans.logical.{LocalLimit, Project, RepartitionByExpression, Sort}
@@ -52,7 +54,7 @@ import org.apache.spark.sql.test.SharedSparkSession
import org.apache.spark.sql.test.SQLTestData._
import org.apache.spark.sql.types._
import org.apache.spark.tags.ExtendedSQLTest
-import org.apache.spark.unsafe.types.CalendarInterval
+import org.apache.spark.unsafe.types.{CalendarInterval, UTF8String}
import org.apache.spark.util.ResetSystemProperties
@ExtendedSQLTest
@@ -4321,6 +4323,30 @@ class SQLQuerySuite extends QueryTest with SharedSparkSession with AdaptiveSpark
checkAnswer(df.repartitionByRange(2, col("v")).selectExpr("try_avg(v)"), Row(null))
}
}
+
+ test("SPARK-39012: SparkSQL cast partition value does not support all data types") {
+ withTempDir { dir =>
+ val binary1 = Hex.hex(UTF8String.fromString("Spark").getBytes).getBytes
+ val binary2 = Hex.hex(UTF8String.fromString("SQL").getBytes).getBytes
+ val data = Seq[(Int, Boolean, Array[Byte])](
+ (1, false, binary1),
+ (2, true, binary2)
+ )
+ data.toDF("a", "b", "c")
+ .write
+ .mode("overwrite")
+ .partitionBy("b", "c")
+ .parquet(dir.getCanonicalPath)
+ val res = spark.read
+ .schema("a INT, b BOOLEAN, c BINARY")
+ .parquet(dir.getCanonicalPath)
+ checkAnswer(res,
+ Seq(
+ Row(1, false, mutable.WrappedArray.make(binary1)),
+ Row(2, true, mutable.WrappedArray.make(binary2))
+ ))
+ }
+ }
}
case class Foo(bar: Option[String])
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org