{"action":"created","comment":{"url":"https://api.github.com/repos/apache/spark/pulls/comments/339387105","pull_request_review_id":307622604,"id":339387105,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDMzOTM4NzEwNQ==","diff_hunk":"@@ -0,0 +1,296 @@\n+/*\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\n+ * contributor license agreements.  See the NOTICE file distributed with\n+ * this work for additional information regarding copyright ownership.\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\n+ * (the \"License\"); you may not use this file except in compliance with\n+ * the License.  You may obtain a copy of the License at\n+ *\n+ *    http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+package org.apache.spark.sql.streaming.ui\n+\n+import java.{util => ju}\n+import java.lang.{Long => JLong}\n+import java.text.SimpleDateFormat\n+import java.util.UUID\n+import javax.servlet.http.HttpServletRequest\n+\n+import scala.collection.JavaConverters._\n+import scala.xml.{Node, Unparsed}\n+\n+import org.apache.spark.internal.Logging\n+import org.apache.spark.sql.catalyst.util.DateTimeUtils.getTimeZone\n+import org.apache.spark.sql.execution.streaming.{QuerySummary, StreamQueryStore}\n+import org.apache.spark.sql.execution.ui.SQLTab\n+import org.apache.spark.sql.streaming.StreamingQuery\n+import org.apache.spark.sql.streaming.ui.UIUtils._\n+import org.apache.spark.ui.{GraphUIData, JsCollector, UIUtils => SparkUIUtils, WebUIPage}\n+\n+class StreamingQueryStatisticsPage(\n+    parent: SQLTab,\n+    store: Option[StreamQueryStore])\n+  extends WebUIPage(\"streaming/statistics\") with Logging {\n+  val df = new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'\")\n+  df.setTimeZone(getTimeZone(\"UTC\"))\n+\n+  def generateLoadResources(request: HttpServletRequest): Seq[Node] = {\n+    // scalastyle:off\n+    <script src={SparkUIUtils.prependBaseUri(request, \"/static/d3.min.js\")}></script>\n+        <link rel=\"stylesheet\" href={SparkUIUtils.prependBaseUri(request, \"/static/streaming-page.css\")} type=\"text/css\"/>\n+      <script src={SparkUIUtils.prependBaseUri(request, \"/static/streaming-page.js\")}></script>\n+    // scalastyle:on\n+  }\n+\n+  override def render(request: HttpServletRequest): Seq[Node] = {\n+    val parameterId = request.getParameter(\"id\")\n+    require(parameterId != null && parameterId.nonEmpty, \"Missing id parameter\")\n+\n+    val (query, timeSinceStart) = if (store.nonEmpty) {\n+      store.get.existingStreamQueries.find { case (query, _) =>\n+        query.runId.equals(UUID.fromString(parameterId))\n+      }.getOrElse(throw new Exception(s\"Can not find streaming query $parameterId\"))\n+    } else {\n+      throw new Exception(s\"Can not find streaming query $parameterId\")\n+    }\n+\n+    val resources = generateLoadResources(request)\n+    val basicInfo = generateBasicInfo(query, timeSinceStart)\n+    val content =\n+      store.synchronized { // make sure all parts in this page are consistent\n+        resources ++\n+          basicInfo ++\n+          generateStatTable(query)\n+      }\n+    SparkUIUtils.headerSparkPage(request, \"Streaming Query Statistics\", content, parent)\n+  }\n+\n+  def generateTimeMap(times: Seq[Long]): Seq[Node] = {\n+    val js = \"var timeFormat = {};\\n\" + times.map { time =>\n+      val formattedTime =\n+        SparkUIUtils.formatBatchTime(time, 1, showYYYYMMSS = false)\n+      s\"timeFormat[$time] = '$formattedTime';\"\n+    }.mkString(\"\\n\")\n+\n+    <script>{Unparsed(js)}</script>\n+  }\n+\n+  def generateVar(values: Array[(Long, ju.Map[String, JLong])]): Seq[Node] = {\n+    val js = \"var timeToValues = {};\\n\" + values.map { case (x, y) =>\n+      val s = y.asScala.toSeq.sortBy(_._1).map(e => s\"\"\"\"${e._2.toDouble}\"\"\"\")\n+        .mkString(\"[\", \",\", \"]\")\n+      s\"\"\"timeToValues[\"${SparkUIUtils.formatBatchTime(x, 1, showYYYYMMSS = false)}\"] = $s;\"\"\"\n+    }.mkString(\"\\n\")\n+\n+    <script>{Unparsed(js)}</script>\n+  }\n+\n+  def generateBasicInfo(query: StreamingQuery, timeSinceStart: Long): Seq[Node] = {\n+    val duration = if (query.isActive) {\n+      SparkUIUtils.formatDurationVerbose(System.currentTimeMillis() - timeSinceStart)\n+    } else {\n+      withNoProgress(query, {\n+        val end = query.lastProgress.timestamp\n+        val start = query.recentProgress.head.timestamp\n+        SparkUIUtils.formatDurationVerbose(\n+          df.parse(end).getTime - df.parse(start).getTime)\n+      }, \"-\")\n+    }\n+\n+    val name = if (query.name == null || query.name.isEmpty) {\n+      \"null\"\n+    } else {\n+      query.name\n+    }\n+\n+    val numBatches = withNoProgress(query, { query.lastProgress.batchId + 1L }, 0)\n+    val totalRecords = query.getQuerySummary.getMetric(QuerySummary.TOTAL_INPUT_RECORDS, 0L)\n+    <div>Running batches for\n+      <strong>\n+        {duration}\n+      </strong>\n+      since\n+      <strong>\n+        {SparkUIUtils.formatDate(timeSinceStart)}\n+      </strong>\n+      (<strong>{numBatches}</strong> completed batches, <strong>{totalRecords}</strong> records)\n+    </div>\n+    <br />\n+    <div>\n+      [name = <strong>{name}</strong>,\n+       id = <strong>{query.id}</strong>,\n+       runId = <strong>{query.runId}</strong>]\n+    </div>\n+    <br />\n+  }\n+\n+  def generateStatTable(query: StreamingQuery): Seq[Node] = {\n+    val batchTimes = withNoProgress(query,\n+      query.recentProgress.map(p => df.parse(p.timestamp).getTime), Array.empty[Long])\n+    val minBatchTime = withNoProgress(query, df.parse(query.recentProgress.head.timestamp).getTime,\n+      0L)\n+    val maxBatchTime = withNoProgress(query, df.parse(query.lastProgress.timestamp).getTime,\n+      0L)","path":"sql/core/src/main/scala/org/apache/spark/sql/streaming/ui/StreamingQueryStatisticsPage.scala","position":140,"original_position":140,"commit_id":"1a994b361417bd0b2c932549fb3f9f8066a88153","original_commit_id":"1a994b361417bd0b2c932549fb3f9f8066a88153","user":{"login":"uncleGen","id":7402327,"node_id":"MDQ6VXNlcjc0MDIzMjc=","avatar_url":"https://avatars1.githubusercontent.com/u/7402327?v=4","gravatar_id":"","url":"https://api.github.com/users/uncleGen","html_url":"https://github.com/uncleGen","followers_url":"https://api.github.com/users/uncleGen/followers","following_url":"https://api.github.com/users/uncleGen/following{/other_user}","gists_url":"https://api.github.com/users/uncleGen/gists{/gist_id}","starred_url":"https://api.github.com/users/uncleGen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/uncleGen/subscriptions","organizations_url":"https://api.github.com/users/uncleGen/orgs","repos_url":"https://api.github.com/users/uncleGen/repos","events_url":"https://api.github.com/users/uncleGen/events{/privacy}","received_events_url":"https://api.github.com/users/uncleGen/received_events","type":"User","site_admin":false},"body":"updated to one line","created_at":"2019-10-28T02:43:57Z","updated_at":"2019-10-28T02:43:58Z","html_url":"https://github.com/apache/spark/pull/26201#discussion_r339387105","pull_request_url":"https://api.github.com/repos/apache/spark/pulls/26201","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/apache/spark/pulls/comments/339387105"},"html":{"href":"https://github.com/apache/spark/pull/26201#discussion_r339387105"},"pull_request":{"href":"https://api.github.com/repos/apache/spark/pulls/26201"}},"in_reply_to_id":338766020},"pull_request":{"url":"https://api.github.com/repos/apache/spark/pulls/26201","id":330800072,"node_id":"MDExOlB1bGxSZXF1ZXN0MzMwODAwMDcy","html_url":"https://github.com/apache/spark/pull/26201","diff_url":"https://github.com/apache/spark/pull/26201.diff","patch_url":"https://github.com/apache/spark/pull/26201.patch","issue_url":"https://api.github.com/repos/apache/spark/issues/26201","number":26201,"state":"open","locked":false,"title":"[SPARK-29543][SS][UI] Init structured streaming ui","user":{"login":"uncleGen","id":7402327,"node_id":"MDQ6VXNlcjc0MDIzMjc=","avatar_url":"https://avatars1.githubusercontent.com/u/7402327?v=4","gravatar_id":"","url":"https://api.github.com/users/uncleGen","html_url":"https://github.com/uncleGen","followers_url":"https://api.github.com/users/uncleGen/followers","following_url":"https://api.github.com/users/uncleGen/following{/other_user}","gists_url":"https://api.github.com/users/uncleGen/gists{/gist_id}","starred_url":"https://api.github.com/users/uncleGen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/uncleGen/subscriptions","organizations_url":"https://api.github.com/users/uncleGen/orgs","repos_url":"https://api.github.com/users/uncleGen/repos","events_url":"https://api.github.com/users/uncleGen/events{/privacy}","received_events_url":"https://api.github.com/users/uncleGen/received_events","type":"User","site_admin":false},"body":"### What changes were proposed in this pull request?\r\n\r\n- Add two pages\r\n   - \"/sql/streaming\": Streaming Query Page, providing some aggregate information for running/complete streaming queries.\r\n  - \"/sql/streaming/statistics\": Streaming Query Statistics Page, providing detailed information for streaming query, including `Input Rate`, `Process Rate`, `Input Rows`, `Batch Duration` and `Operation Duration`\r\n- Add two new metric `totalInputRecords` and `batchDuration` \r\n- Add two html resource files: `streaming-page.css` and `streaming-page.js`\r\n\r\n![image](https://user-images.githubusercontent.com/7402327/67258613-15eafd80-f4c4-11e9-8d46-3fec8a07ff08.png)\r\n![image](https://user-images.githubusercontent.com/7402327/67258631-2b602780-f4c4-11e9-93df-03e1e060cf12.png)\r\n![image](https://user-images.githubusercontent.com/7402327/67259136-e38ecf80-f4c6-11e9-82df-42cc8d4f73df.png)\r\n![image](https://user-images.githubusercontent.com/7402327/67260466-0f618380-f4ce-11e9-9a2c-8ab3480a59d3.png)\r\n\r\n### Why are the changes needed?\r\n\r\nIt helps users to better monitor Structured Streaming job.\r\n\r\n### Does this PR introduce any user-facing change?\r\n\r\nNo\r\n\r\n### How was this patch tested?\r\n\r\n- new added and existing UTs\r\n- manual test","created_at":"2019-10-22T04:32:08Z","updated_at":"2019-10-28T02:43:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b19f83add860ec7043b0637bc22c26e6afa1b8f4","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1406587328,"node_id":"MDU6TGFiZWwxNDA2NTg3MzI4","url":"https://api.github.com/repos/apache/spark/labels/STRUCTURED%20STREAMING","name":"STRUCTURED STREAMING","color":"ededed","default":false},{"id":1406605079,"node_id":"MDU6TGFiZWwxNDA2NjA1MDc5","url":"https://api.github.com/repos/apache/spark/labels/WEB%20UI","name":"WEB UI","color":"ededed","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/apache/spark/pulls/26201/commits","review_comments_url":"https://api.github.com/repos/apache/spark/pulls/26201/comments","review_comment_url":"https://api.github.com/repos/apache/spark/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/spark/issues/26201/comments","statuses_url":"https://api.github.com/repos/apache/spark/statuses/1a994b361417bd0b2c932549fb3f9f8066a88153","head":{"label":"uncleGen:SPARK-29543","ref":"SPARK-29543","sha":"1a994b361417bd0b2c932549fb3f9f8066a88153","user":{"login":"uncleGen","id":7402327,"node_id":"MDQ6VXNlcjc0MDIzMjc=","avatar_url":"https://avatars1.githubusercontent.com/u/7402327?v=4","gravatar_id":"","url":"https://api.github.com/users/uncleGen","html_url":"https://github.com/uncleGen","followers_url":"https://api.github.com/users/uncleGen/followers","following_url":"https://api.github.com/users/uncleGen/following{/other_user}","gists_url":"https://api.github.com/users/uncleGen/gists{/gist_id}","starred_url":"https://api.github.com/users/uncleGen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/uncleGen/subscriptions","organizations_url":"https://api.github.com/users/uncleGen/orgs","repos_url":"https://api.github.com/users/uncleGen/repos","events_url":"https://api.github.com/users/uncleGen/events{/privacy}","received_events_url":"https://api.github.com/users/uncleGen/received_events","type":"User","site_admin":false},"repo":{"id":23988410,"node_id":"MDEwOlJlcG9zaXRvcnkyMzk4ODQxMA==","name":"spark","full_name":"uncleGen/spark","private":false,"owner":{"login":"uncleGen","id":7402327,"node_id":"MDQ6VXNlcjc0MDIzMjc=","avatar_url":"https://avatars1.githubusercontent.com/u/7402327?v=4","gravatar_id":"","url":"https://api.github.com/users/uncleGen","html_url":"https://github.com/uncleGen","followers_url":"https://api.github.com/users/uncleGen/followers","following_url":"https://api.github.com/users/uncleGen/following{/other_user}","gists_url":"https://api.github.com/users/uncleGen/gists{/gist_id}","starred_url":"https://api.github.com/users/uncleGen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/uncleGen/subscriptions","organizations_url":"https://api.github.com/users/uncleGen/orgs","repos_url":"https://api.github.com/users/uncleGen/repos","events_url":"https://api.github.com/users/uncleGen/events{/privacy}","received_events_url":"https://api.github.com/users/uncleGen/received_events","type":"User","site_admin":false},"html_url":"https://github.com/uncleGen/spark","description":"Mirror of Apache Spark","fork":true,"url":"https://api.github.com/repos/uncleGen/spark","forks_url":"https://api.github.com/repos/uncleGen/spark/forks","keys_url":"https://api.github.com/repos/uncleGen/spark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/uncleGen/spark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/uncleGen/spark/teams","hooks_url":"https://api.github.com/repos/uncleGen/spark/hooks","issue_events_url":"https://api.github.com/repos/uncleGen/spark/issues/events{/number}","events_url":"https://api.github.com/repos/uncleGen/spark/events","assignees_url":"https://api.github.com/repos/uncleGen/spark/assignees{/user}","branches_url":"https://api.github.com/repos/uncleGen/spark/branches{/branch}","tags_url":"https://api.github.com/repos/uncleGen/spark/tags","blobs_url":"https://api.github.com/repos/uncleGen/spark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/uncleGen/spark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/uncleGen/spark/git/refs{/sha}","trees_url":"https://api.github.com/repos/uncleGen/spark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/uncleGen/spark/statuses/{sha}","languages_url":"https://api.github.com/repos/uncleGen/spark/languages","stargazers_url":"https://api.github.com/repos/uncleGen/spark/stargazers","contributors_url":"https://api.github.com/repos/uncleGen/spark/contributors","subscribers_url":"https://api.github.com/repos/uncleGen/spark/subscribers","subscription_url":"https://api.github.com/repos/uncleGen/spark/subscription","commits_url":"https://api.github.com/repos/uncleGen/spark/commits{/sha}","git_commits_url":"https://api.github.com/repos/uncleGen/spark/git/commits{/sha}","comments_url":"https://api.github.com/repos/uncleGen/spark/comments{/number}","issue_comment_url":"https://api.github.com/repos/uncleGen/spark/issues/comments{/number}","contents_url":"https://api.github.com/repos/uncleGen/spark/contents/{+path}","compare_url":"https://api.github.com/repos/uncleGen/spark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/uncleGen/spark/merges","archive_url":"https://api.github.com/repos/uncleGen/spark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/uncleGen/spark/downloads","issues_url":"https://api.github.com/repos/uncleGen/spark/issues{/number}","pulls_url":"https://api.github.com/repos/uncleGen/spark/pulls{/number}","milestones_url":"https://api.github.com/repos/uncleGen/spark/milestones{/number}","notifications_url":"https://api.github.com/repos/uncleGen/spark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/uncleGen/spark/labels{/name}","releases_url":"https://api.github.com/repos/uncleGen/spark/releases{/id}","deployments_url":"https://api.github.com/repos/uncleGen/spark/deployments","created_at":"2014-09-13T07:16:52Z","updated_at":"2015-03-24T04:21:04Z","pushed_at":"2019-10-24T11:22:04Z","git_url":"git://github.com/uncleGen/spark.git","ssh_url":"git@github.com:uncleGen/spark.git","clone_url":"https://github.com/uncleGen/spark.git","svn_url":"https://github.com/uncleGen/spark","homepage":null,"size":294354,"stargazers_count":1,"watchers_count":1,"language":"Scala","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"fd899d6331f4777a36a3f2a79a6b2fa123dccc1a","user":{"login":"apache","id":47359,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ3MzU5","avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","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,"node_id":"MDEwOlJlcG9zaXRvcnkxNzE2NTY1OA==","name":"spark","full_name":"apache/spark","private":false,"owner":{"login":"apache","id":47359,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ3MzU5","avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","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},"html_url":"https://github.com/apache/spark","description":"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":"2019-10-28T02:17:57Z","pushed_at":"2019-10-28T02:29:46Z","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":"","size":315004,"stargazers_count":23979,"watchers_count":23979,"language":"Scala","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":20376,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":475,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":20376,"open_issues":475,"watchers":23979,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/spark/pulls/26201"},"html":{"href":"https://github.com/apache/spark/pull/26201"},"issue":{"href":"https://api.github.com/repos/apache/spark/issues/26201"},"comments":{"href":"https://api.github.com/repos/apache/spark/issues/26201/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/spark/pulls/26201/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/spark/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/spark/pulls/26201/commits"},"statuses":{"href":"https://api.github.com/repos/apache/spark/statuses/1a994b361417bd0b2c932549fb3f9f8066a88153"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"uncleGen"}}