You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@carbondata.apache.org by GitBox <gi...@apache.org> on 2021/04/06 05:27:52 UTC

[GitHub] [carbondata] Indhumathi27 commented on a change in pull request #4113: [CARBONDATA-4161] Describe complex columns

Indhumathi27 commented on a change in pull request #4113:
URL: https://github.com/apache/carbondata/pull/4113#discussion_r607512702



##########
File path: integration/spark/src/main/scala/org/apache/spark/sql/parser/CarbonSparkSqlParserUtil.scala
##########
@@ -744,6 +747,52 @@ object CarbonSparkSqlParserUtil {
     CarbonAlterTableAddColumnCommand(alterTableAddColumnsModel)
   }
 
+
+  def describeColumn(
+      databaseNameOp: Option[String],
+      tableName: String,
+      inputFields: java.util.List[String]
+  ): CarbonDescribeColumnCommand = {
+    val sparkSession = SparkSQLUtil.getSparkSession
+    validateTableExists(databaseNameOp, tableName, sparkSession)
+    val relation = CarbonEnv
+      .getInstance(sparkSession)
+      .carbonMetaStore
+      .lookupRelation(databaseNameOp, tableName)(sparkSession)
+      .asInstanceOf[CarbonRelation]
+    val tableSchema = StructType.fromAttributes(relation.output)
+    val carbonTable = relation.carbonTable
+    val inputColumn = tableSchema.find(_.name.equalsIgnoreCase(inputFields.get(0)))
+    if (!inputColumn.isDefined) {
+      throw new MalformedCarbonCommandException(
+        s"${inputFields.get(0)} not present in schema of table: $tableName")
+    }
+    CarbonDescribeColumnCommand(
+      carbonTable,
+      inputFields,
+      inputColumn.get
+    )
+  }
+
+  def describeShort(
+      databaseNameOp: Option[String],
+      tableName: String
+  ): CarbonDescribeShortCommand = {
+    val sparkSession = SparkSQLUtil.getSparkSession
+    validateTableExists(databaseNameOp, tableName, sparkSession)

Review comment:
       Can move duplicate code from describeShort and describeColumn to common method

##########
File path: integration/spark/src/main/scala/org/apache/spark/sql/parser/CarbonExtensionSpark2SqlParser.scala
##########
@@ -27,7 +28,26 @@ import org.apache.spark.sql.catalyst.plans.logical._
 class CarbonExtensionSpark2SqlParser extends CarbonSpark2SqlParser {
 
   override protected lazy val extendedSparkSyntax: Parser[LogicalPlan] =
-    loadDataNew | alterTableAddColumns | explainPlan
+    loadDataNew | alterTableAddColumns | explainPlan | describeColumn | describeShort

Review comment:
       I think, no need to define here, since CarbonExtensionSpark2SqlParser extends CarbonSpark2SqlParser.

##########
File path: integration/spark/src/main/scala/org/apache/spark/sql/execution/command/table/CarbonDescribeFormattedCommand.scala
##########
@@ -370,3 +373,134 @@ private[sql] case class CarbonDescribeFormattedCommand(
 
   override protected def opName: String = "DESC FORMATTED"
 }
+
+case class CarbonDescribeColumnCommand(
+    carbonTable: CarbonTable,
+    inputFieldNames: java.util.List[String],
+    field: StructField)
+  extends MetadataCommand {
+
+  override val output: Seq[Attribute] = Seq(
+    // Column names are based on Hive.
+    AttributeReference("col_name", StringType, nullable = false,
+      new MetadataBuilder().putString("comment", "name of the column").build())(),
+    AttributeReference("data_type", StringType, nullable = false,
+      new MetadataBuilder().putString("comment", "data type of the column").build())(),
+    AttributeReference("comment", StringType, nullable = true,
+      new MetadataBuilder().putString("comment", "comment of the column").build())()
+  )
+
+  override def processMetadata(sparkSession: SparkSession): Seq[Row] = {
+    setAuditTable(carbonTable)
+    var results = Seq[(String, String, String)]()
+    var currField = field
+    val inputFieldsIterator = inputFieldNames.iterator()
+    var inputColumn = inputFieldsIterator.next()
+    while (results.size == 0) {
+      breakable {
+        if (currField.dataType.typeName.equalsIgnoreCase(CarbonCommonConstants.ARRAY)) {
+          if (inputFieldsIterator.hasNext) {
+            val nextField = inputFieldsIterator.next()
+            if (!nextField.equalsIgnoreCase("item")) {
+              throw handleException(nextField, currField.name, carbonTable.getTableName)
+            }
+            currField = StructField("item", currField.dataType.asInstanceOf[ArrayType].elementType)
+            inputColumn += "." + currField.name
+            break()
+          }
+          val colComment = currField.getComment().getOrElse("null")
+          results = Seq((inputColumn,
+            currField.dataType.typeName, currField.getComment().getOrElse("null")),
+            ("## Children of " + inputColumn + ":  ", "", ""))
+          results ++= Seq(("item", currField.dataType.asInstanceOf[ArrayType]
+            .elementType.simpleString, colComment))

Review comment:
       colComment given for Parent Column, will be displayed while describe child columns also?




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org