@@ -21,6 +21,7 @@ import java.net.URI
2121import java .util .Date
2222
2323import com .google .common .base .Objects
24+ import scala .collection .mutable
2425
2526import org .apache .spark .sql .AnalysisException
2627import org .apache .spark .sql .catalyst .{CatalystConf , FunctionIdentifier , InternalRow , TableIdentifier }
@@ -57,20 +58,25 @@ case class CatalogStorageFormat(
5758 properties : Map [String , String ]) {
5859
5960 override def toString : String = {
60- val serdePropsToString = CatalogUtils .maskCredentials(properties) match {
61- case props if props.isEmpty => " "
62- case props => " Properties: " + props.map(p => p._1 + " =" + p._2).mkString(" [" , " , " , " ]" )
63- }
64- val output =
65- Seq (locationUri.map(" Location: " + _).getOrElse(" " ),
66- inputFormat.map(" InputFormat: " + _).getOrElse(" " ),
67- outputFormat.map(" OutputFormat: " + _).getOrElse(" " ),
68- if (compressed) " Compressed" else " " ,
69- serde.map(" Serde: " + _).getOrElse(" " ),
70- serdePropsToString)
71- output.filter(_.nonEmpty).mkString(" Storage(" , " , " , " )" )
61+ toLinkedHashMap.map { case ((key, value)) =>
62+ if (value.isEmpty) key else s " $key: $value"
63+ }.mkString(" Storage(" , " , " , " )" )
7264 }
7365
66+ def toLinkedHashMap : mutable.LinkedHashMap [String , String ] = {
67+ val map = new mutable.LinkedHashMap [String , String ]()
68+ locationUri.foreach(l => map.put(" Location" , l.toString))
69+ serde.foreach(map.put(" Serde Library" , _))
70+ inputFormat.foreach(map.put(" InputFormat" , _))
71+ outputFormat.foreach(map.put(" OutputFormat" , _))
72+ if (compressed) map.put(" Compressed" , " " )
73+ CatalogUtils .maskCredentials(properties) match {
74+ case props if props.isEmpty => // No-op
75+ case props =>
76+ map.put(" Properties" , props.map(p => p._1 + " =" + p._2).mkString(" [" , " , " , " ]" ))
77+ }
78+ map
79+ }
7480}
7581
7682object CatalogStorageFormat {
@@ -91,20 +97,27 @@ case class CatalogTablePartition(
9197 storage : CatalogStorageFormat ,
9298 parameters : Map [String , String ] = Map .empty) {
9399
94- private def toStringSeq : Seq [String ] = {
100+ def toLinkedHashMap : mutable.LinkedHashMap [String , String ] = {
101+ val map = new mutable.LinkedHashMap [String , String ]()
95102 val specString = spec.map { case (k, v) => s " $k= $v" }.mkString(" , " )
96- Seq (
97- s " Partition Values: [ $specString] " ,
98- s " $storage" ,
99- s " Partition Parameters:{ ${parameters.map(p => p._1 + " =" + p._2).mkString(" , " )}} " )
103+ map.put(" Partition Values" , s " [ $specString] " )
104+ map ++= storage.toLinkedHashMap
105+ if (parameters.nonEmpty) {
106+ map.put(" Partition Parameters" , s " { ${parameters.map(p => p._1 + " =" + p._2).mkString(" , " )}} " )
107+ }
108+ map
100109 }
101110
102111 override def toString : String = {
103- toStringSeq.filter(_.nonEmpty).mkString(" CatalogPartition(\n\t " , " \n\t " , " )" )
112+ toLinkedHashMap.map { case ((key, value)) =>
113+ if (value.isEmpty) key else s " $key: $value"
114+ }.mkString(" CatalogPartition(\n\t " , " \n\t " , " )" )
104115 }
105116
106117 def simpleString : String = {
107- toStringSeq.filter(_.nonEmpty).mkString(" " , " \n " , " " )
118+ toLinkedHashMap.map { case ((key, value)) =>
119+ if (value.isEmpty) key else s " $key: $value"
120+ }.mkString(" " , " \n " , " " )
108121 }
109122
110123 /** Return the partition location, assuming it is specified. */
@@ -159,6 +172,14 @@ case class BucketSpec(
159172 }
160173 s " $numBuckets buckets, $bucketString$sortString"
161174 }
175+
176+ def toLinkedHashMap : mutable.LinkedHashMap [String , String ] = {
177+ mutable.LinkedHashMap [String , String ](
178+ " Num Buckets" -> numBuckets.toString,
179+ " Bucket Columns" -> bucketColumnNames.map(quoteIdentifier).mkString(" [" , " , " , " ]" ),
180+ " Sort Columns" -> sortColumnNames.map(quoteIdentifier).mkString(" [" , " , " , " ]" )
181+ )
182+ }
162183}
163184
164185/**
@@ -266,44 +287,48 @@ case class CatalogTable(
266287 locationUri, inputFormat, outputFormat, serde, compressed, properties))
267288 }
268289
269- private def toStringSeq : Seq [String ] = {
290+
291+ def toLinkedHashMap : mutable.LinkedHashMap [String , String ] = {
292+ val map = new mutable.LinkedHashMap [String , String ]()
270293 val tableProperties = properties.map(p => p._1 + " =" + p._2).mkString(" [" , " , " , " ]" )
271294 val partitionColumns = partitionColumnNames.map(quoteIdentifier).mkString(" [" , " , " , " ]" )
272- val bucketStrings = bucketSpec match {
273- case Some (BucketSpec (numBuckets, bucketColumnNames, sortColumnNames)) =>
274- val bucketColumnsString = bucketColumnNames.map(quoteIdentifier).mkString(" [" , " , " , " ]" )
275- val sortColumnsString = sortColumnNames.map(quoteIdentifier).mkString(" [" , " , " , " ]" )
276- Seq (
277- s " Num Buckets: $numBuckets" ,
278- if (bucketColumnNames.nonEmpty) s " Bucket Columns: $bucketColumnsString" else " " ,
279- if (sortColumnNames.nonEmpty) s " Sort Columns: $sortColumnsString" else " "
280- )
281- case _ => Nil
295+
296+ map.put(" Table" , identifier.quotedString)
297+ if (owner.nonEmpty) map.put(" Owner" , owner)
298+ map.put(" Created" , new Date (createTime).toString)
299+ map.put(" Last Access" , new Date (lastAccessTime).toString)
300+ map.put(" Type" , tableType.name)
301+ provider.foreach(map.put(" Provider" , _))
302+ bucketSpec.foreach(map ++= _.toLinkedHashMap)
303+ comment.foreach(map.put(" Comment" , _))
304+ if (tableType == CatalogTableType .VIEW ) {
305+ viewText.foreach(map.put(" View Text" , _))
306+ viewDefaultDatabase.foreach(map.put(" View Default Database" , _))
307+ if (viewQueryColumnNames.nonEmpty) {
308+ map.put(" View Query Output Columns" , viewQueryColumnNames.mkString(" [" , " , " , " ]" ))
309+ }
282310 }
283311
284- Seq (s " Table: ${identifier.quotedString}" ,
285- if (owner.nonEmpty) s " Owner: $owner" else " " ,
286- s " Created: ${new Date (createTime).toString}" ,
287- s " Last Access: ${new Date (lastAccessTime).toString}" ,
288- s " Type: ${tableType.name}" ,
289- if (provider.isDefined) s " Provider: ${provider.get}" else " " ,
290- if (partitionColumnNames.nonEmpty) s " Partition Columns: $partitionColumns" else " "
291- ) ++ bucketStrings ++ Seq (
292- viewText.map(" View: " + _).getOrElse(" " ),
293- comment.map(" Comment: " + _).getOrElse(" " ),
294- if (properties.nonEmpty) s " Properties: $tableProperties" else " " ,
295- if (stats.isDefined) s " Statistics: ${stats.get.simpleString}" else " " ,
296- s " $storage" ,
297- if (tracksPartitionsInCatalog) " Partition Provider: Catalog" else " " ,
298- if (schema.nonEmpty) s " Schema: ${schema.treeString}" else " " )
312+ if (properties.nonEmpty) map.put(" Properties" , tableProperties)
313+ stats.foreach(s => map.put(" Statistics" , s.simpleString))
314+ map ++= storage.toLinkedHashMap
315+ if (tracksPartitionsInCatalog) map.put(" Partition Provider" , " Catalog" )
316+ if (partitionColumnNames.nonEmpty) map.put(" Partition Columns" , partitionColumns)
317+ if (schema.nonEmpty) map.put(" Schema" , schema.treeString)
318+
319+ map
299320 }
300321
301322 override def toString : String = {
302- toStringSeq.filter(_.nonEmpty).mkString(" CatalogTable(\n " , " \n " , " )" )
323+ toLinkedHashMap.map { case ((key, value)) =>
324+ if (value.isEmpty) key else s " $key: $value"
325+ }.mkString(" CatalogTable(\n " , " \n " , " )" )
303326 }
304327
305328 def simpleString : String = {
306- toStringSeq.filter(_.nonEmpty).mkString(" " , " \n " , " " )
329+ toLinkedHashMap.map { case ((key, value)) =>
330+ if (value.isEmpty) key else s " $key: $value"
331+ }.mkString(" " , " \n " , " " )
307332 }
308333}
309334
0 commit comments