{"action":"created","comment":{"url":"https://api.github.com/repos/apache/spark/pulls/comments/59893181","id":59893181,"diff_hunk":"@@ -625,11 +629,215 @@ private[hive] class HiveClientImpl(\n       }\n   }\n \n+  override def showCreateTable(db: String, tableName: String): String = withHiveState {\n+    Option(client.getTable(db, tableName, false)).map { hiveTable =>\n+      val tblProperties = hiveTable.getParameters.asScala.toMap\n+      if (tblProperties.get(\"spark.sql.sources.provider\").isDefined) {\n+        generateDataSourceDDL(hiveTable)\n+      } else {\n+        generateHiveDDL(hiveTable)\n+      }\n+    }.get\n+  }\n+\n \n   /* -------------------------------------------------------- *\n    |  Helper methods for converting to and from Hive classes  |\n    * -------------------------------------------------------- */\n \n+  private def generateCreateTableHeader(\n+              hiveTable: HiveTable,\n+              processedProps: scala.collection.mutable.ArrayBuffer[String]): String = {\n+    val sb = new StringBuilder(\"CREATE \")\n+    if(hiveTable.isTemporary) {\n+      sb.append(\"TEMPORARY \")\n+    }\n+    if (hiveTable.getTableType == HiveTableType.EXTERNAL_TABLE) {\n+      processedProps += \"EXTERNAL\"\n+      sb.append(\"EXTERNAL TABLE \" +\n+        quoteIdentifier(hiveTable.getDbName) + \".\" + quoteIdentifier(hiveTable.getTableName))\n+    } else {\n+      sb.append(\"TABLE \" +\n+        quoteIdentifier(hiveTable.getDbName) + \".\" + quoteIdentifier(hiveTable.getTableName))\n+    }\n+    sb.toString()\n+  }\n+\n+  private def generateColsDataSource(\n+              hiveTable: HiveTable,\n+              processedProps: scala.collection.mutable.ArrayBuffer[String]): String = {\n+    val schemaStringFromParts: Option[String] = {\n+      val props = hiveTable.getParameters.asScala\n+      props.get(\"spark.sql.sources.schema.numParts\").map { numParts =>\n+        val parts = (0 until numParts.toInt).map { index =>\n+          val part = props.get(s\"spark.sql.sources.schema.part.$index\").orNull\n+          if (part == null) {\n+            throw new AnalysisException(\n+              \"Could not read schema from the metastore because it is corrupted \" +\n+                s\"(missing part $index of the schema, $numParts parts are expected).\")\n+          }\n+          part\n+        }\n+        // Stick all parts back to a single schema string.\n+        parts.mkString\n+      }\n+    }\n+\n+    if (schemaStringFromParts.isDefined) {\n+      (schemaStringFromParts.map(s => DataType.fromJson(s).asInstanceOf[StructType]).\n+        get map { f => s\"${quoteIdentifier(f.name)} ${f.dataType.sql}\" })\n+        .mkString(\"( \", \", \", \" )\")\n+    } else {\n+      \"\"\n+    }\n+  }\n+\n+  private def generateDataSourceDDL(hiveTable: HiveTable): String = {","path":"sql/hive/src/main/scala/org/apache/spark/sql/hive/client/HiveClientImpl.scala","position":89,"original_position":89,"commit_id":"fa8373c3fd2d27cf2b3356ee0214c8e04dfc0f36","original_commit_id":"fa8373c3fd2d27cf2b3356ee0214c8e04dfc0f36","user":{"login":"xwu0226","id":14225992,"avatar_url":"https://avatars.githubusercontent.com/u/14225992?v=3","gravatar_id":"","url":"https://api.github.com/users/xwu0226","html_url":"https://github.com/xwu0226","followers_url":"https://api.github.com/users/xwu0226/followers","following_url":"https://api.github.com/users/xwu0226/following{/other_user}","gists_url":"https://api.github.com/users/xwu0226/gists{/gist_id}","starred_url":"https://api.github.com/users/xwu0226/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xwu0226/subscriptions","organizations_url":"https://api.github.com/users/xwu0226/orgs","repos_url":"https://api.github.com/users/xwu0226/repos","events_url":"https://api.github.com/users/xwu0226/events{/privacy}","received_events_url":"https://api.github.com/users/xwu0226/received_events","type":"User","site_admin":false},"body":"@hvanhovell Are you referring to generateDataSourceDDL or generateHiveDDL? ","created_at":"2016-04-15T15:32:56Z","updated_at":"2016-04-15T15:32:56Z","html_url":"https://github.com/apache/spark/pull/12406#discussion_r59893181","pull_request_url":"https://api.github.com/repos/apache/spark/pulls/12406","_links":{"self":{"href":"https://api.github.com/repos/apache/spark/pulls/comments/59893181"},"html":{"href":"https://github.com/apache/spark/pull/12406#discussion_r59893181"},"pull_request":{"href":"https://api.github.com/repos/apache/spark/pulls/12406"}}},"pull_request":{"url":"https://api.github.com/repos/apache/spark/pulls/12406","id":66579657,"html_url":"https://github.com/apache/spark/pull/12406","diff_url":"https://github.com/apache/spark/pull/12406.diff","patch_url":"https://github.com/apache/spark/pull/12406.patch","issue_url":"https://api.github.com/repos/apache/spark/issues/12406","number":12406,"state":"open","locked":false,"title":"[SPARK-14346] [SQL][WIP] Show create table ","user":{"login":"xwu0226","id":14225992,"avatar_url":"https://avatars.githubusercontent.com/u/14225992?v=3","gravatar_id":"","url":"https://api.github.com/users/xwu0226","html_url":"https://github.com/xwu0226","followers_url":"https://api.github.com/users/xwu0226/followers","following_url":"https://api.github.com/users/xwu0226/following{/other_user}","gists_url":"https://api.github.com/users/xwu0226/gists{/gist_id}","starred_url":"https://api.github.com/users/xwu0226/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xwu0226/subscriptions","organizations_url":"https://api.github.com/users/xwu0226/orgs","repos_url":"https://api.github.com/users/xwu0226/repos","events_url":"https://api.github.com/users/xwu0226/events{/privacy}","received_events_url":"https://api.github.com/users/xwu0226/received_events","type":"User","site_admin":false},"body":"## What changes were proposed in this pull request?\r\nAllow users to issue \"`SHOW CREATE TABLE`\" command natively in SparkSQL. \r\n-- For tables that are created by Hive, this command will display the DDL in hive syntax. If the syntax includes `CLUSTERED BY, SKEWED BY or STORED BY` clause, there will be a warning message saying that this DDL is not supported in SparkSQL native DDL yet. \r\n\r\n-- For tables that are created by datasource DDL, such as \"`CREATE TABLE... USING ... OPTIONS (...)`\", it will show the DDL in this syntax. \r\n\r\n-- For tables that are created by dataframe API, such as \"`df.write.partitionBy(...).saveAsTable(...)`\", currently the command will display DDL with the syntax \"CREATE TABLE.. USING...OPTIONS(...)\". However, this syntax lose the partitioning information. It is proposed to display create table in the dataframe API format (in progress)\r\n\r\n## How was this patch tested?\r\nUnit tests are created. \r\n\r\n\r\n","created_at":"2016-04-15T01:46:44Z","updated_at":"2016-04-15T15:32:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b85ed479bc3ae386e8f1b7553f217197493fd2fe","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/apache/spark/pulls/12406/commits","review_comments_url":"https://api.github.com/repos/apache/spark/pulls/12406/comments","review_comment_url":"https://api.github.com/repos/apache/spark/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/spark/issues/12406/comments","statuses_url":"https://api.github.com/repos/apache/spark/statuses/fa8373c3fd2d27cf2b3356ee0214c8e04dfc0f36","head":{"label":"xwu0226:show_create_table_2","ref":"show_create_table_2","sha":"fa8373c3fd2d27cf2b3356ee0214c8e04dfc0f36","user":{"login":"xwu0226","id":14225992,"avatar_url":"https://avatars.githubusercontent.com/u/14225992?v=3","gravatar_id":"","url":"https://api.github.com/users/xwu0226","html_url":"https://github.com/xwu0226","followers_url":"https://api.github.com/users/xwu0226/followers","following_url":"https://api.github.com/users/xwu0226/following{/other_user}","gists_url":"https://api.github.com/users/xwu0226/gists{/gist_id}","starred_url":"https://api.github.com/users/xwu0226/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xwu0226/subscriptions","organizations_url":"https://api.github.com/users/xwu0226/orgs","repos_url":"https://api.github.com/users/xwu0226/repos","events_url":"https://api.github.com/users/xwu0226/events{/privacy}","received_events_url":"https://api.github.com/users/xwu0226/received_events","type":"User","site_admin":false},"repo":{"id":42968936,"name":"spark","full_name":"xwu0226/spark","owner":{"login":"xwu0226","id":14225992,"avatar_url":"https://avatars.githubusercontent.com/u/14225992?v=3","gravatar_id":"","url":"https://api.github.com/users/xwu0226","html_url":"https://github.com/xwu0226","followers_url":"https://api.github.com/users/xwu0226/followers","following_url":"https://api.github.com/users/xwu0226/following{/other_user}","gists_url":"https://api.github.com/users/xwu0226/gists{/gist_id}","starred_url":"https://api.github.com/users/xwu0226/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xwu0226/subscriptions","organizations_url":"https://api.github.com/users/xwu0226/orgs","repos_url":"https://api.github.com/users/xwu0226/repos","events_url":"https://api.github.com/users/xwu0226/events{/privacy}","received_events_url":"https://api.github.com/users/xwu0226/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/xwu0226/spark","description":"Mirror of Apache Spark","fork":true,"url":"https://api.github.com/repos/xwu0226/spark","forks_url":"https://api.github.com/repos/xwu0226/spark/forks","keys_url":"https://api.github.com/repos/xwu0226/spark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/xwu0226/spark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/xwu0226/spark/teams","hooks_url":"https://api.github.com/repos/xwu0226/spark/hooks","issue_events_url":"https://api.github.com/repos/xwu0226/spark/issues/events{/number}","events_url":"https://api.github.com/repos/xwu0226/spark/events","assignees_url":"https://api.github.com/repos/xwu0226/spark/assignees{/user}","branches_url":"https://api.github.com/repos/xwu0226/spark/branches{/branch}","tags_url":"https://api.github.com/repos/xwu0226/spark/tags","blobs_url":"https://api.github.com/repos/xwu0226/spark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/xwu0226/spark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/xwu0226/spark/git/refs{/sha}","trees_url":"https://api.github.com/repos/xwu0226/spark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/xwu0226/spark/statuses/{sha}","languages_url":"https://api.github.com/repos/xwu0226/spark/languages","stargazers_url":"https://api.github.com/repos/xwu0226/spark/stargazers","contributors_url":"https://api.github.com/repos/xwu0226/spark/contributors","subscribers_url":"https://api.github.com/repos/xwu0226/spark/subscribers","subscription_url":"https://api.github.com/repos/xwu0226/spark/subscription","commits_url":"https://api.github.com/repos/xwu0226/spark/commits{/sha}","git_commits_url":"https://api.github.com/repos/xwu0226/spark/git/commits{/sha}","comments_url":"https://api.github.com/repos/xwu0226/spark/comments{/number}","issue_comment_url":"https://api.github.com/repos/xwu0226/spark/issues/comments{/number}","contents_url":"https://api.github.com/repos/xwu0226/spark/contents/{+path}","compare_url":"https://api.github.com/repos/xwu0226/spark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/xwu0226/spark/merges","archive_url":"https://api.github.com/repos/xwu0226/spark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/xwu0226/spark/downloads","issues_url":"https://api.github.com/repos/xwu0226/spark/issues{/number}","pulls_url":"https://api.github.com/repos/xwu0226/spark/pulls{/number}","milestones_url":"https://api.github.com/repos/xwu0226/spark/milestones{/number}","notifications_url":"https://api.github.com/repos/xwu0226/spark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/xwu0226/spark/labels{/name}","releases_url":"https://api.github.com/repos/xwu0226/spark/releases{/id}","deployments_url":"https://api.github.com/repos/xwu0226/spark/deployments","created_at":"2015-09-23T00:30:54Z","updated_at":"2016-01-15T19:57:06Z","pushed_at":"2016-04-15T02:04:04Z","git_url":"git://github.com/xwu0226/spark.git","ssh_url":"git@github.com:xwu0226/spark.git","clone_url":"https://github.com/xwu0226/spark.git","svn_url":"https://github.com/xwu0226/spark","homepage":null,"size":156296,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"c80586d9e820d19fc328b3e4c6f1c1439f5583a7","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":17165658,"name":"spark","full_name":"apache/spark","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/spark","description":"Mirror of Apache Spark","fork":false,"url":"https://api.github.com/repos/apache/spark","forks_url":"https://api.github.com/repos/apache/spark/forks","keys_url":"https://api.github.com/repos/apache/spark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/spark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/spark/teams","hooks_url":"https://api.github.com/repos/apache/spark/hooks","issue_events_url":"https://api.github.com/repos/apache/spark/issues/events{/number}","events_url":"https://api.github.com/repos/apache/spark/events","assignees_url":"https://api.github.com/repos/apache/spark/assignees{/user}","branches_url":"https://api.github.com/repos/apache/spark/branches{/branch}","tags_url":"https://api.github.com/repos/apache/spark/tags","blobs_url":"https://api.github.com/repos/apache/spark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/spark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/spark/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/spark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/spark/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/spark/languages","stargazers_url":"https://api.github.com/repos/apache/spark/stargazers","contributors_url":"https://api.github.com/repos/apache/spark/contributors","subscribers_url":"https://api.github.com/repos/apache/spark/subscribers","subscription_url":"https://api.github.com/repos/apache/spark/subscription","commits_url":"https://api.github.com/repos/apache/spark/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/spark/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/spark/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/spark/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/spark/contents/{+path}","compare_url":"https://api.github.com/repos/apache/spark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/spark/merges","archive_url":"https://api.github.com/repos/apache/spark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/spark/downloads","issues_url":"https://api.github.com/repos/apache/spark/issues{/number}","pulls_url":"https://api.github.com/repos/apache/spark/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/spark/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/spark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/spark/labels{/name}","releases_url":"https://api.github.com/repos/apache/spark/releases{/id}","deployments_url":"https://api.github.com/repos/apache/spark/deployments","created_at":"2014-02-25T08:00:08Z","updated_at":"2016-04-15T12:13:52Z","pushed_at":"2016-04-15T15:31:32Z","git_url":"git://github.com/apache/spark.git","ssh_url":"git@github.com:apache/spark.git","clone_url":"https://github.com/apache/spark.git","svn_url":"https://github.com/apache/spark","homepage":null,"size":456433,"stargazers_count":8148,"watchers_count":8148,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":7548,"mirror_url":"git://git.apache.org/spark.git","open_issues_count":447,"forks":7548,"open_issues":447,"watchers":8148,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/spark/pulls/12406"},"html":{"href":"https://github.com/apache/spark/pull/12406"},"issue":{"href":"https://api.github.com/repos/apache/spark/issues/12406"},"comments":{"href":"https://api.github.com/repos/apache/spark/issues/12406/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/spark/pulls/12406/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/spark/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/spark/pulls/12406/commits"},"statuses":{"href":"https://api.github.com/repos/apache/spark/statuses/fa8373c3fd2d27cf2b3356ee0214c8e04dfc0f36"}}}}