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 2020/12/24 08:56:45 UTC
[spark] branch branch-3.1 updated: [SPARK-33892][SQL] Display
char/varchar in DESC and SHOW CREATE TABLE
This is an automated email from the ASF dual-hosted git repository.
wenchen pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/branch-3.1 by this push:
new e13d47a [SPARK-33892][SQL] Display char/varchar in DESC and SHOW CREATE TABLE
e13d47a is described below
commit e13d47a46ccda552886f59d57d5d696942f8b846
Author: Kent Yao <ya...@hotmail.com>
AuthorDate: Thu Dec 24 08:56:02 2020 +0000
[SPARK-33892][SQL] Display char/varchar in DESC and SHOW CREATE TABLE
### What changes were proposed in this pull request?
Display char/varchar in
- DESC table
- DESC column
- SHOW CREATE TABLE
### Why are the changes needed?
show the correct definition for users
### Does this PR introduce _any_ user-facing change?
yes, char/varchar column's will print char/varchar instead of string
### How was this patch tested?
new tests
Closes #30908 from yaooqinn/SPARK-33892.
Authored-by: Kent Yao <ya...@hotmail.com>
Signed-off-by: Wenchen Fan <we...@databricks.com>
(cherry picked from commit 29cca68e9e55fae8389378de6f30d0dfa7a74010)
Signed-off-by: Wenchen Fan <we...@databricks.com>
---
.../spark/sql/execution/command/tables.scala | 12 +++++----
.../datasources/v2/ShowTablePropertiesExec.scala | 4 +--
.../execution/datasources/v2/V2CommandExec.scala | 4 +++
.../apache/spark/sql/CharVarcharTestSuite.scala | 29 ++++++++++++++++++++++
.../spark/sql/HiveCharVarcharTestSuite.scala | 9 +++++++
5 files changed, 50 insertions(+), 8 deletions(-)
diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/command/tables.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/command/tables.scala
index cfc3d7d..c29c609 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/execution/command/tables.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/command/tables.scala
@@ -35,7 +35,7 @@ import org.apache.spark.sql.catalyst.catalog.CatalogTypes.TablePartitionSpec
import org.apache.spark.sql.catalyst.expressions.{Attribute, AttributeReference}
import org.apache.spark.sql.catalyst.plans.DescribeCommandSchema
import org.apache.spark.sql.catalyst.plans.logical._
-import org.apache.spark.sql.catalyst.util.{escapeSingleQuotedString, quoteIdentifier, CaseInsensitiveMap}
+import org.apache.spark.sql.catalyst.util.{escapeSingleQuotedString, quoteIdentifier, CaseInsensitiveMap, CharVarcharUtils}
import org.apache.spark.sql.execution.datasources.DataSource
import org.apache.spark.sql.execution.datasources.csv.CSVFileFormat
import org.apache.spark.sql.execution.datasources.json.JsonFileFormat
@@ -638,7 +638,7 @@ case class DescribeTableCommand(
}
describeSchema(catalog.lookupRelation(table).schema, result, header = false)
} else {
- val metadata = catalog.getTableMetadata(table)
+ val metadata = catalog.getTableRawMetadata(table)
if (metadata.schema.isEmpty) {
// In older version(prior to 2.1) of Spark, the table schema can be empty and should be
// inferred at runtime. We should still support it.
@@ -789,9 +789,11 @@ case class DescribeColumnCommand(
None
}
+ val dataType = CharVarcharUtils.getRawType(field.metadata)
+ .getOrElse(field.dataType).catalogString
val buffer = ArrayBuffer[Row](
Row("col_name", field.name),
- Row("data_type", field.dataType.catalogString),
+ Row("data_type", dataType),
Row("comment", comment.getOrElse("NULL"))
)
if (isExtended) {
@@ -1122,7 +1124,7 @@ case class ShowCreateTableCommand(table: TableIdentifier)
throw new AnalysisException(
s"SHOW CREATE TABLE is not supported on a temporary view: ${table.identifier}")
} else {
- val tableMetadata = catalog.getTableMetadata(table)
+ val tableMetadata = catalog.getTableRawMetadata(table)
// TODO: [SPARK-28692] unify this after we unify the
// CREATE TABLE syntax for hive serde and data source table.
@@ -1273,7 +1275,7 @@ case class ShowCreateTableAsSerdeCommand(table: TableIdentifier)
override def run(sparkSession: SparkSession): Seq[Row] = {
val catalog = sparkSession.sessionState.catalog
- val tableMetadata = catalog.getTableMetadata(table)
+ val tableMetadata = catalog.getTableRawMetadata(table)
val stmt = if (DDLUtils.isDatasourceTable(tableMetadata)) {
throw new AnalysisException(
diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/ShowTablePropertiesExec.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/ShowTablePropertiesExec.scala
index 7ceee1e..6d3a94e 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/ShowTablePropertiesExec.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/ShowTablePropertiesExec.scala
@@ -19,7 +19,7 @@ package org.apache.spark.sql.execution.datasources.v2
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.encoders.RowEncoder
-import org.apache.spark.sql.catalyst.expressions.{Attribute, AttributeSet, GenericRowWithSchema}
+import org.apache.spark.sql.catalyst.expressions.{Attribute, GenericRowWithSchema}
import org.apache.spark.sql.connector.catalog.{CatalogV2Util, Table}
/**
@@ -30,8 +30,6 @@ case class ShowTablePropertiesExec(
catalogTable: Table,
propertyKey: Option[String]) extends V2CommandExec {
- override def producedAttributes: AttributeSet = AttributeSet(output)
-
override protected def run(): Seq[InternalRow] = {
import scala.collection.JavaConverters._
val toRow = RowEncoder(schema).resolveAndBind().createSerializer()
diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/V2CommandExec.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/V2CommandExec.scala
index 7738f26..6b19367 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/V2CommandExec.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/V2CommandExec.scala
@@ -19,6 +19,7 @@ package org.apache.spark.sql.execution.datasources.v2
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.catalyst.InternalRow
+import org.apache.spark.sql.catalyst.expressions.AttributeSet
import org.apache.spark.sql.execution.SparkPlan
/**
@@ -55,4 +56,7 @@ abstract class V2CommandExec extends SparkPlan {
}
override def children: Seq[SparkPlan] = Nil
+
+ override def producedAttributes: AttributeSet = outputSet
+
}
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/CharVarcharTestSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/CharVarcharTestSuite.scala
index 8ab8c37..9d4b7c4 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/CharVarcharTestSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/CharVarcharTestSuite.scala
@@ -443,6 +443,14 @@ trait CharVarcharTestSuite extends QueryTest with SQLTestUtils {
("c1 IN (c2)", true)))
}
}
+
+ test("SPARK-33892: DESCRIBE TABLE w/ char/varchar") {
+ withTable("t") {
+ sql(s"CREATE TABLE t(v VARCHAR(3), c CHAR(5)) USING $format")
+ checkAnswer(sql("desc t").selectExpr("data_type").where("data_type like '%char%'"),
+ Seq(Row("char(5)"), Row("varchar(3)")))
+ }
+ }
}
// Some basic char/varchar tests which doesn't rely on table implementation.
@@ -603,6 +611,27 @@ class FileSourceCharVarcharTestSuite extends CharVarcharTestSuite with SharedSpa
}
}
}
+
+ // TODO(SPARK-33875): Move these tests to super after DESCRIBE COLUMN v2 implemented
+ test("SPARK-33892: DESCRIBE COLUMN w/ char/varchar") {
+ withTable("t") {
+ sql(s"CREATE TABLE t(v VARCHAR(3), c CHAR(5)) USING $format")
+ checkAnswer(sql("desc t v").selectExpr("info_value").where("info_value like '%char%'"),
+ Row("varchar(3)"))
+ checkAnswer(sql("desc t c").selectExpr("info_value").where("info_value like '%char%'"),
+ Row("char(5)"))
+ }
+ }
+
+ // TODO(SPARK-33898): Move these tests to super after SHOW CREATE TABLE for v2 implemented
+ test("SPARK-33892: SHOW CREATE TABLE w/ char/varchar") {
+ withTable("t") {
+ sql(s"CREATE TABLE t(v VARCHAR(3), c CHAR(5)) USING $format")
+ val rest = sql("SHOW CREATE TABLE t").head().getString(0)
+ assert(rest.contains("VARCHAR(3)"))
+ assert(rest.contains("CHAR(5)"))
+ }
+ }
}
class DSV2CharVarcharTestSuite extends CharVarcharTestSuite
diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/HiveCharVarcharTestSuite.scala b/sql/hive/src/test/scala/org/apache/spark/sql/HiveCharVarcharTestSuite.scala
index f48cfb8..bb7918c 100644
--- a/sql/hive/src/test/scala/org/apache/spark/sql/HiveCharVarcharTestSuite.scala
+++ b/sql/hive/src/test/scala/org/apache/spark/sql/HiveCharVarcharTestSuite.scala
@@ -41,6 +41,15 @@ class HiveCharVarcharTestSuite extends CharVarcharTestSuite with TestHiveSinglet
}
super.afterAll()
}
+
+ test("SPARK-33892: SHOW CREATE TABLE AS SERDE w/ char/varchar") {
+ withTable("t") {
+ sql(s"CREATE TABLE t(v VARCHAR(3), c CHAR(5)) USING $format")
+ val rest = sql("SHOW CREATE TABLE t AS SERDE").head().getString(0)
+ assert(rest.contains("VARCHAR(3)"))
+ assert(rest.contains("CHAR(5)"))
+ }
+ }
}
class HiveCharVarcharDDLTestSuite extends CharVarcharDDLTestBase with TestHiveSingleton {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org