{"action":"created","comment":{"url":"https://api.github.com/repos/apache/spark/pulls/comments/184584878","pull_request_review_id":115811842,"id":184584878,"diff_hunk":"@@ -55,44 +60,128 @@ class MulticlassMetricsSuite extends SparkFunSuite with MLlibTestSparkContext {\n     val f2measure1 = (1 + 2 * 2) * precision1 * recall1 / (2 * 2 * precision1 + recall1)\n     val f2measure2 = (1 + 2 * 2) * precision2 * recall2 / (2 * 2 * precision2 + recall2)\n \n-    assert(metrics.confusionMatrix.toArray.sameElements(confusionMatrix.toArray))\n-    assert(math.abs(metrics.truePositiveRate(0.0) - tpRate0) < delta)\n-    assert(math.abs(metrics.truePositiveRate(1.0) - tpRate1) < delta)\n-    assert(math.abs(metrics.truePositiveRate(2.0) - tpRate2) < delta)\n-    assert(math.abs(metrics.falsePositiveRate(0.0) - fpRate0) < delta)\n-    assert(math.abs(metrics.falsePositiveRate(1.0) - fpRate1) < delta)\n-    assert(math.abs(metrics.falsePositiveRate(2.0) - fpRate2) < delta)\n-    assert(math.abs(metrics.precision(0.0) - precision0) < delta)\n-    assert(math.abs(metrics.precision(1.0) - precision1) < delta)\n-    assert(math.abs(metrics.precision(2.0) - precision2) < delta)\n-    assert(math.abs(metrics.recall(0.0) - recall0) < delta)\n-    assert(math.abs(metrics.recall(1.0) - recall1) < delta)\n-    assert(math.abs(metrics.recall(2.0) - recall2) < delta)\n-    assert(math.abs(metrics.fMeasure(0.0) - f1measure0) < delta)\n-    assert(math.abs(metrics.fMeasure(1.0) - f1measure1) < delta)\n-    assert(math.abs(metrics.fMeasure(2.0) - f1measure2) < delta)\n-    assert(math.abs(metrics.fMeasure(0.0, 2.0) - f2measure0) < delta)\n-    assert(math.abs(metrics.fMeasure(1.0, 2.0) - f2measure1) < delta)\n-    assert(math.abs(metrics.fMeasure(2.0, 2.0) - f2measure2) < delta)\n+    assert(metrics.confusionMatrix.asML ~== confusionMatrix.asML relTol delta)\n+    assert(metrics.truePositiveRate(0.0) ~== tpRate0 absTol delta)\n+    assert(metrics.truePositiveRate(1.0) ~== tpRate1 absTol delta)\n+    assert(metrics.truePositiveRate(2.0) ~== tpRate2 absTol delta)\n+    assert(metrics.falsePositiveRate(0.0) ~== fpRate0 absTol delta)\n+    assert(metrics.falsePositiveRate(1.0) ~== fpRate1 absTol delta)\n+    assert(metrics.falsePositiveRate(2.0) ~== fpRate2 absTol delta)\n+    assert(metrics.precision(0.0) ~== precision0 absTol delta)\n+    assert(metrics.precision(1.0) ~== precision1 absTol delta)\n+    assert(metrics.precision(2.0) ~== precision2 absTol delta)\n+    assert(metrics.recall(0.0) ~== recall0 absTol delta)\n+    assert(metrics.recall(1.0) ~== recall1 absTol delta)\n+    assert(metrics.recall(2.0) ~== recall2 absTol delta)\n+    assert(metrics.fMeasure(0.0) ~== f1measure0 absTol delta)\n+    assert(metrics.fMeasure(1.0) ~== f1measure1 absTol delta)\n+    assert(metrics.fMeasure(2.0) ~== f1measure2 absTol delta)\n+    assert(metrics.fMeasure(0.0, 2.0) ~== f2measure0 absTol delta)\n+    assert(metrics.fMeasure(1.0, 2.0) ~== f2measure1 absTol delta)\n+    assert(metrics.fMeasure(2.0, 2.0) ~== f2measure2 absTol delta)\n+\n+    assert(metrics.accuracy ~==\n+      (2.0 + 3.0 + 1.0) / ((2 + 3 + 1) + (1 + 1 + 1)) absTol delta)\n+    assert(metrics.accuracy ~== metrics.precision absTol delta)\n+    assert(metrics.accuracy ~== metrics.recall absTol delta)\n+    assert(metrics.accuracy ~== metrics.fMeasure absTol delta)\n+    assert(metrics.accuracy ~== metrics.weightedRecall absTol delta)\n+    val weight0 = 4.0 / 9\n+    val weight1 = 4.0 / 9\n+    val weight2 = 1.0 / 9\n+    assert(metrics.weightedTruePositiveRate ~==\n+      (weight0 * tpRate0 + weight1 * tpRate1 + weight2 * tpRate2) absTol delta)\n+    assert(metrics.weightedFalsePositiveRate ~==\n+      (weight0 * fpRate0 + weight1 * fpRate1 + weight2 * fpRate2) absTol delta)\n+    assert(metrics.weightedPrecision ~==\n+      (weight0 * precision0 + weight1 * precision1 + weight2 * precision2) absTol delta)\n+    assert(metrics.weightedRecall ~==\n+      (weight0 * recall0 + weight1 * recall1 + weight2 * recall2) absTol delta)\n+    assert(metrics.weightedFMeasure ~==\n+      (weight0 * f1measure0 + weight1 * f1measure1 + weight2 * f1measure2) absTol delta)\n+    assert(metrics.weightedFMeasure(2.0) ~==\n+      (weight0 * f2measure0 + weight1 * f2measure1 + weight2 * f2measure2) absTol delta)\n+    assert(metrics.labels === labels)\n+  }\n+\n+  test(\"Multiclass evaluation metrics with weights\") {\n+    /*\n+     * Confusion matrix for 3-class classification with total 9 instances with 2 weights:\n+     * |2 * w1|1 * w2         |1 * w1| true class0 (4 instances)\n+     * |1 * w2|2 * w1 + 1 * w2|0     | true class1 (4 instances)\n+     * |0     |0              |1 * w2| true class2 (1 instance)\n+     */\n+    val w1 = 2.2\n+    val w2 = 1.5\n+    val tw = 2.0 * w1 + 1.0 * w2 + 1.0 * w1 + 1.0 * w2 + 2.0 * w1 + 1.0 * w2 + 1.0 * w2\n+    val confusionMatrix = Matrices.dense(3, 3,\n+      Array(2 * w1, 1 * w2, 0, 1 * w2, 2 * w1 + 1 * w2, 0, 1 * w1, 0, 1 * w2))\n+    val labels = Array(0.0, 1.0, 2.0)\n+    val predictionAndLabelsWithWeights = sc.parallelize(\n+      Seq((0.0, 0.0, w1), (0.0, 1.0, w2), (0.0, 0.0, w1), (1.0, 0.0, w2),\n+        (1.0, 1.0, w1), (1.0, 1.0, w2), (1.0, 1.0, w1), (2.0, 2.0, w2),\n+        (2.0, 0.0, w1)), 2)\n+    val metrics = new MulticlassMetrics(predictionAndLabelsWithWeights)\n+    val tpRate0 = (2.0 * w1) / (2.0 * w1 + 1.0 * w2 + 1.0 * w1)\n+    val tpRate1 = (2.0 * w1 + 1.0 * w2) / (2.0 * w1 + 1.0 * w2 + 1.0 * w2)\n+    val tpRate2 = (1.0 * w2) / (1.0 * w2 + 0)\n+    val fpRate0 = (1.0 * w2) / (tw - (2.0 * w1 + 1.0 * w2 + 1.0 * w1))\n+    val fpRate1 = (1.0 * w2) / (tw - (1.0 * w2 + 2.0 * w1 + 1.0 * w2))\n+    val fpRate2 = (1.0 * w1) / (tw - (1.0 * w2))\n+    val precision0 = (2.0 * w1) / (2 * w1 + 1 * w2)\n+    val precision1 = (2.0 * w1 + 1.0 * w2) / (2.0 * w1 + 1.0 * w2 + 1.0 * w2)\n+    val precision2 = (1.0 * w2) / (1 * w1 + 1 * w2)\n+    val recall0 = (2.0 * w1) / (2.0 * w1 + 1.0 * w2 + 1.0 * w1)\n+    val recall1 = (2.0 * w1 + 1.0 * w2) / (2.0 * w1 + 1.0 * w2 + 1.0 * w2)\n+    val recall2 = (1.0 * w2) / (1.0 * w2 + 0)\n+    val f1measure0 = 2 * precision0 * recall0 / (precision0 + recall0)\n+    val f1measure1 = 2 * precision1 * recall1 / (precision1 + recall1)\n+    val f1measure2 = 2 * precision2 * recall2 / (precision2 + recall2)\n+    val f2measure0 = (1 + 2 * 2) * precision0 * recall0 / (2 * 2 * precision0 + recall0)\n+    val f2measure1 = (1 + 2 * 2) * precision1 * recall1 / (2 * 2 * precision1 + recall1)\n+    val f2measure2 = (1 + 2 * 2) * precision2 * recall2 / (2 * 2 * precision2 + recall2)\n+\n+    assert(metrics.confusionMatrix.asML ~== confusionMatrix.asML relTol delta)\n+    assert(metrics.truePositiveRate(0.0) ~== tpRate0 absTol delta)\n+    assert(metrics.truePositiveRate(1.0) ~== tpRate1 absTol delta)\n+    assert(metrics.truePositiveRate(2.0)  ~==  tpRate2 absTol delta)\n+    assert(metrics.falsePositiveRate(0.0)  ~==  fpRate0 absTol delta)\n+    assert(metrics.falsePositiveRate(1.0)  ~==  fpRate1 absTol delta)\n+    assert(metrics.falsePositiveRate(2.0)  ~==  fpRate2 absTol delta)\n+    assert(metrics.precision(0.0)  ~==  precision0 absTol delta)\n+    assert(metrics.precision(1.0)  ~==  precision1 absTol delta)\n+    assert(metrics.precision(2.0)  ~==  precision2 absTol delta)\n+    assert(metrics.recall(0.0)  ~==  recall0 absTol delta)\n+    assert(metrics.recall(1.0)  ~==  recall1 absTol delta)\n+    assert(metrics.recall(2.0)  ~==  recall2 absTol delta)\n+    assert(metrics.fMeasure(0.0)  ~==  f1measure0 absTol delta)\n+    assert(metrics.fMeasure(1.0)  ~==  f1measure1 absTol delta)\n+    assert(metrics.fMeasure(2.0)  ~==  f1measure2 absTol delta)\n+    assert(metrics.fMeasure(0.0, 2.0)  ~==  f2measure0 absTol delta)\n+    assert(metrics.fMeasure(1.0, 2.0)  ~==  f2measure1 absTol delta)\n+    assert(metrics.fMeasure(2.0, 2.0)  ~==  f2measure2 absTol delta)\n \n-    assert(math.abs(metrics.accuracy -\n-      (2.0 + 3.0 + 1.0) / ((2 + 3 + 1) + (1 + 1 + 1))) < delta)\n-    assert(math.abs(metrics.accuracy - metrics.precision) < delta)\n-    assert(math.abs(metrics.accuracy - metrics.recall) < delta)\n-    assert(math.abs(metrics.accuracy - metrics.fMeasure) < delta)\n-    assert(math.abs(metrics.accuracy - metrics.weightedRecall) < delta)\n-    assert(math.abs(metrics.weightedTruePositiveRate -\n-      ((4.0 / 9) * tpRate0 + (4.0 / 9) * tpRate1 + (1.0 / 9) * tpRate2)) < delta)\n-    assert(math.abs(metrics.weightedFalsePositiveRate -\n-      ((4.0 / 9) * fpRate0 + (4.0 / 9) * fpRate1 + (1.0 / 9) * fpRate2)) < delta)\n-    assert(math.abs(metrics.weightedPrecision -\n-      ((4.0 / 9) * precision0 + (4.0 / 9) * precision1 + (1.0 / 9) * precision2)) < delta)\n-    assert(math.abs(metrics.weightedRecall -\n-      ((4.0 / 9) * recall0 + (4.0 / 9) * recall1 + (1.0 / 9) * recall2)) < delta)\n-    assert(math.abs(metrics.weightedFMeasure -\n-      ((4.0 / 9) * f1measure0 + (4.0 / 9) * f1measure1 + (1.0 / 9) * f1measure2)) < delta)\n-    assert(math.abs(metrics.weightedFMeasure(2.0) -\n-      ((4.0 / 9) * f2measure0 + (4.0 / 9) * f2measure1 + (1.0 / 9) * f2measure2)) < delta)\n-    assert(metrics.labels.sameElements(labels))\n+    assert(metrics.accuracy  ~==\n+      (2.0 * w1 + 2.0 * w1 + 1.0 * w2 + 1.0 * w2) / tw absTol delta)\n+    assert(metrics.accuracy  ~==  metrics.precision absTol delta)\n+    assert(metrics.accuracy  ~==  metrics.recall absTol delta)\n+    assert(metrics.accuracy  ~==  metrics.fMeasure absTol delta)\n+    assert(metrics.accuracy  ~==  metrics.weightedRecall absTol delta)\n+    val weight0 = (2 * w1 + 1 * w2 + 1 * w1) / tw\n+    val weight1 = (1 * w2 + 2 * w1 + 1 * w2) / tw\n+    val weight2 = 1 * w2 / tw\n+    assert(metrics.weightedTruePositiveRate  ~==\n+      (weight0 * tpRate0 + weight1 * tpRate1 + weight2 * tpRate2) absTol delta)\n+    assert(metrics.weightedFalsePositiveRate  ~==\n+      (weight0 * fpRate0 + weight1 * fpRate1 + weight2 * fpRate2) absTol delta)\n+    assert(metrics.weightedPrecision  ~==\n+      (weight0 * precision0 + weight1 * precision1 + weight2 * precision2) absTol delta)\n+    assert(metrics.weightedRecall  ~==\n+      (weight0 * recall0 + weight1 * recall1 + weight2 * recall2) absTol delta)\n+    assert(metrics.weightedFMeasure  ~==\n+      (weight0 * f1measure0 + weight1 * f1measure1 + weight2 * f1measure2) absTol delta)\n+    assert(metrics.weightedFMeasure(2.0)  ~==\n+      (weight0 * f2measure0 + weight1 * f2measure1 + weight2 * f2measure2) absTol delta)","path":"mllib/src/test/scala/org/apache/spark/mllib/evaluation/MulticlassMetricsSuite.scala","position":188,"original_position":188,"commit_id":"6906dc4a9fb8d6efde9fb1763c79ad9381fc8dea","original_commit_id":"6906dc4a9fb8d6efde9fb1763c79ad9381fc8dea","user":{"login":"WeichenXu123","id":19235986,"avatar_url":"https://avatars0.githubusercontent.com/u/19235986?v=4","gravatar_id":"","url":"https://api.github.com/users/WeichenXu123","html_url":"https://github.com/WeichenXu123","followers_url":"https://api.github.com/users/WeichenXu123/followers","following_url":"https://api.github.com/users/WeichenXu123/following{/other_user}","gists_url":"https://api.github.com/users/WeichenXu123/gists{/gist_id}","starred_url":"https://api.github.com/users/WeichenXu123/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WeichenXu123/subscriptions","organizations_url":"https://api.github.com/users/WeichenXu123/orgs","repos_url":"https://api.github.com/users/WeichenXu123/repos","events_url":"https://api.github.com/users/WeichenXu123/events{/privacy}","received_events_url":"https://api.github.com/users/WeichenXu123/received_events","type":"User","site_admin":false},"body":"I think maybe `relTol` will be better than `absTol`, except the cases that one side is zero. What do you think of it ?","created_at":"2018-04-27T03:35:10Z","updated_at":"2018-04-27T03:35:11Z","html_url":"https://github.com/apache/spark/pull/17086#discussion_r184584878","pull_request_url":"https://api.github.com/repos/apache/spark/pulls/17086","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/apache/spark/pulls/comments/184584878"},"html":{"href":"https://github.com/apache/spark/pull/17086#discussion_r184584878"},"pull_request":{"href":"https://api.github.com/repos/apache/spark/pulls/17086"}}},"pull_request":{"url":"https://api.github.com/repos/apache/spark/pulls/17086","id":108173729,"html_url":"https://github.com/apache/spark/pull/17086","diff_url":"https://github.com/apache/spark/pull/17086.diff","patch_url":"https://github.com/apache/spark/pull/17086.patch","issue_url":"https://api.github.com/repos/apache/spark/issues/17086","number":17086,"state":"open","locked":false,"title":"[SPARK-24101][ML][MLLIB] ML Evaluators should use weight column - added weight column for multiclass classification evaluator","user":{"login":"imatiach-msft","id":24683184,"avatar_url":"https://avatars0.githubusercontent.com/u/24683184?v=4","gravatar_id":"","url":"https://api.github.com/users/imatiach-msft","html_url":"https://github.com/imatiach-msft","followers_url":"https://api.github.com/users/imatiach-msft/followers","following_url":"https://api.github.com/users/imatiach-msft/following{/other_user}","gists_url":"https://api.github.com/users/imatiach-msft/gists{/gist_id}","starred_url":"https://api.github.com/users/imatiach-msft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/imatiach-msft/subscriptions","organizations_url":"https://api.github.com/users/imatiach-msft/orgs","repos_url":"https://api.github.com/users/imatiach-msft/repos","events_url":"https://api.github.com/users/imatiach-msft/events{/privacy}","received_events_url":"https://api.github.com/users/imatiach-msft/received_events","type":"User","site_admin":false},"body":"## What changes were proposed in this pull request?\r\n\r\nThe evaluators BinaryClassificationEvaluator, RegressionEvaluator, and MulticlassClassificationEvaluator and the corresponding metrics classes BinaryClassificationMetrics, RegressionMetrics and MulticlassMetrics should use sample weight data.\r\n\r\nI've closed the PR: https://github.com/apache/spark/pull/16557\r\n as recommended in favor of creating three pull requests, one for each of the evaluators (binary/regression/multiclass) to make it easier to review/update.\r\n\r\nNote: I've updated the JIRA to:\r\nhttps://issues.apache.org/jira/browse/SPARK-24101\r\nWhich is a child of JIRA:\r\nhttps://issues.apache.org/jira/browse/SPARK-18693\r\n\r\n## How was this patch tested?\r\n\r\nI added tests to the metrics class.\r\n","created_at":"2017-02-27T18:31:25Z","updated_at":"2018-04-27T03:35:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fad109fb7e384b9a114724f3fcaf37a9301af5f8","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/apache/spark/pulls/17086/commits","review_comments_url":"https://api.github.com/repos/apache/spark/pulls/17086/comments","review_comment_url":"https://api.github.com/repos/apache/spark/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/spark/issues/17086/comments","statuses_url":"https://api.github.com/repos/apache/spark/statuses/6906dc4a9fb8d6efde9fb1763c79ad9381fc8dea","head":{"label":"imatiach-msft:ilmat/multiclass-evaluate","ref":"ilmat/multiclass-evaluate","sha":"6906dc4a9fb8d6efde9fb1763c79ad9381fc8dea","user":{"login":"imatiach-msft","id":24683184,"avatar_url":"https://avatars0.githubusercontent.com/u/24683184?v=4","gravatar_id":"","url":"https://api.github.com/users/imatiach-msft","html_url":"https://github.com/imatiach-msft","followers_url":"https://api.github.com/users/imatiach-msft/followers","following_url":"https://api.github.com/users/imatiach-msft/following{/other_user}","gists_url":"https://api.github.com/users/imatiach-msft/gists{/gist_id}","starred_url":"https://api.github.com/users/imatiach-msft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/imatiach-msft/subscriptions","organizations_url":"https://api.github.com/users/imatiach-msft/orgs","repos_url":"https://api.github.com/users/imatiach-msft/repos","events_url":"https://api.github.com/users/imatiach-msft/events{/privacy}","received_events_url":"https://api.github.com/users/imatiach-msft/received_events","type":"User","site_admin":false},"repo":{"id":76980395,"name":"spark","full_name":"imatiach-msft/spark","owner":{"login":"imatiach-msft","id":24683184,"avatar_url":"https://avatars0.githubusercontent.com/u/24683184?v=4","gravatar_id":"","url":"https://api.github.com/users/imatiach-msft","html_url":"https://github.com/imatiach-msft","followers_url":"https://api.github.com/users/imatiach-msft/followers","following_url":"https://api.github.com/users/imatiach-msft/following{/other_user}","gists_url":"https://api.github.com/users/imatiach-msft/gists{/gist_id}","starred_url":"https://api.github.com/users/imatiach-msft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/imatiach-msft/subscriptions","organizations_url":"https://api.github.com/users/imatiach-msft/orgs","repos_url":"https://api.github.com/users/imatiach-msft/repos","events_url":"https://api.github.com/users/imatiach-msft/events{/privacy}","received_events_url":"https://api.github.com/users/imatiach-msft/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/imatiach-msft/spark","description":"Mirror of Apache Spark","fork":true,"url":"https://api.github.com/repos/imatiach-msft/spark","forks_url":"https://api.github.com/repos/imatiach-msft/spark/forks","keys_url":"https://api.github.com/repos/imatiach-msft/spark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/imatiach-msft/spark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/imatiach-msft/spark/teams","hooks_url":"https://api.github.com/repos/imatiach-msft/spark/hooks","issue_events_url":"https://api.github.com/repos/imatiach-msft/spark/issues/events{/number}","events_url":"https://api.github.com/repos/imatiach-msft/spark/events","assignees_url":"https://api.github.com/repos/imatiach-msft/spark/assignees{/user}","branches_url":"https://api.github.com/repos/imatiach-msft/spark/branches{/branch}","tags_url":"https://api.github.com/repos/imatiach-msft/spark/tags","blobs_url":"https://api.github.com/repos/imatiach-msft/spark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/imatiach-msft/spark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/imatiach-msft/spark/git/refs{/sha}","trees_url":"https://api.github.com/repos/imatiach-msft/spark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/imatiach-msft/spark/statuses/{sha}","languages_url":"https://api.github.com/repos/imatiach-msft/spark/languages","stargazers_url":"https://api.github.com/repos/imatiach-msft/spark/stargazers","contributors_url":"https://api.github.com/repos/imatiach-msft/spark/contributors","subscribers_url":"https://api.github.com/repos/imatiach-msft/spark/subscribers","subscription_url":"https://api.github.com/repos/imatiach-msft/spark/subscription","commits_url":"https://api.github.com/repos/imatiach-msft/spark/commits{/sha}","git_commits_url":"https://api.github.com/repos/imatiach-msft/spark/git/commits{/sha}","comments_url":"https://api.github.com/repos/imatiach-msft/spark/comments{/number}","issue_comment_url":"https://api.github.com/repos/imatiach-msft/spark/issues/comments{/number}","contents_url":"https://api.github.com/repos/imatiach-msft/spark/contents/{+path}","compare_url":"https://api.github.com/repos/imatiach-msft/spark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/imatiach-msft/spark/merges","archive_url":"https://api.github.com/repos/imatiach-msft/spark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/imatiach-msft/spark/downloads","issues_url":"https://api.github.com/repos/imatiach-msft/spark/issues{/number}","pulls_url":"https://api.github.com/repos/imatiach-msft/spark/pulls{/number}","milestones_url":"https://api.github.com/repos/imatiach-msft/spark/milestones{/number}","notifications_url":"https://api.github.com/repos/imatiach-msft/spark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/imatiach-msft/spark/labels{/name}","releases_url":"https://api.github.com/repos/imatiach-msft/spark/releases{/id}","deployments_url":"https://api.github.com/repos/imatiach-msft/spark/deployments","created_at":"2016-12-20T18:10:57Z","updated_at":"2018-04-26T15:26:55Z","pushed_at":"2018-04-26T16:32:01Z","git_url":"git://github.com/imatiach-msft/spark.git","ssh_url":"git@github.com:imatiach-msft/spark.git","clone_url":"https://github.com/imatiach-msft/spark.git","svn_url":"https://github.com/imatiach-msft/spark","homepage":null,"size":264521,"stargazers_count":0,"watchers_count":0,"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,"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"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"ce2f919f8df1b794ceaa23e1a59d5d541ed47bf5","user":{"login":"apache","id":47359,"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,"name":"spark","full_name":"apache/spark","owner":{"login":"apache","id":47359,"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},"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":"2018-04-27T03:29:48Z","pushed_at":"2018-04-27T03:20:18Z","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":268955,"stargazers_count":17082,"watchers_count":17082,"language":"Scala","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":15657,"mirror_url":null,"archived":false,"open_issues_count":522,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":15657,"open_issues":522,"watchers":17082,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/spark/pulls/17086"},"html":{"href":"https://github.com/apache/spark/pull/17086"},"issue":{"href":"https://api.github.com/repos/apache/spark/issues/17086"},"comments":{"href":"https://api.github.com/repos/apache/spark/issues/17086/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/spark/pulls/17086/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/spark/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/spark/pulls/17086/commits"},"statuses":{"href":"https://api.github.com/repos/apache/spark/statuses/6906dc4a9fb8d6efde9fb1763c79ad9381fc8dea"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"WeichenXu123"}}