GitHub PullRequestReviewCommentEvent at 2014-06-10 16:00:00
Repository: spark
Actor: yhuai
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/apache/spark/pulls/comments/13602167","id":13602167,"diff_hunk":"@@ -0,0 +1,371 @@\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.json\n+\n+import org.apache.spark.sql.QueryTest\n+import org.apache.spark.sql.test.TestSQLContext._\n+import org.apache.spark.sql.catalyst.expressions.{ExprId, AttributeReference, Attribute}\n+import org.apache.spark.sql.catalyst.plans.generateSchemaTreeString\n+import org.apache.spark.sql.catalyst.types._\n+import org.apache.spark.sql.catalyst.util._\n+\n+class JsonSuite extends QueryTest {\n+  import TestJsonData._\n+  TestJsonData\n+\n+  /**\n+   * Since attribute references are given globally unique ids during analysis,\n+   * we must normalize them to check if two different queries are identical.\n+   */\n+  protected def normalizeExprIds(attributes: Seq[Attribute]) = {\n+    val minId = attributes.map(_.exprId.id).min\n+    attributes.map {\n+      case a: AttributeReference =>\n+        AttributeReference(a.name, a.dataType, a.nullable)(exprId = ExprId(a.exprId.id - minId))\n+    }\n+  }\n+\n+  protected def checkSchema(expected: Seq[Attribute], actual: Seq[Attribute]): Unit = {\n+    val normalizedExpected = normalizeExprIds(expected).toSeq\n+    val normalizedActual = normalizeExprIds(actual).toSeq\n+    if (normalizedExpected != normalizedActual) {\n+      fail(\n+        s\"\"\"\n+          |=== FAIL: Schemas do not match ===\n+          |${sideBySide(\n+              s\"== Expected Schema ==\\n\" +\n+              generateSchemaTreeString(normalizedExpected),\n+              s\"==  Actual Schema  ==\\n\" +\n+              generateSchemaTreeString(normalizedActual)).mkString(\"\\n\")}\n+        \"\"\".stripMargin)\n+    }\n+  }\n+\n+  test(\"Primitive field and type inferring\") {\n+    val jsonSchemaRDD = jsonRDD(primitiveFieldAndType)\n+\n+    val expectedSchema =\n+      AttributeReference(\"bigInteger\", DecimalType, true)() ::\n+      AttributeReference(\"boolean\", BooleanType, true)() ::\n+      AttributeReference(\"double\", DoubleType, true)() ::\n+      AttributeReference(\"integer\", IntegerType, true)() ::\n+      AttributeReference(\"long\", LongType, true)() ::\n+      AttributeReference(\"null\", StringType, true)() ::\n+      AttributeReference(\"string\", StringType, true)() :: Nil\n+\n+    checkSchema(expectedSchema, jsonSchemaRDD.logicalPlan.output)\n+\n+    jsonSchemaRDD.registerAsTable(\"jsonTable\")\n+\n+    checkAnswer(\n+      sql(\"select * from jsonTable\"),\n+      (BigDecimal(\"92233720368547758070\"),\n+      true,\n+      1.7976931348623157E308,\n+      10,\n+      21474836470L,\n+      null,\n+      \"this is a simple string.\") :: Nil\n+    )\n+  }\n+\n+  test(\"Complex field and type inferring\") {\n+    val jsonSchemaRDD = jsonRDD(complexFieldAndType)\n+\n+    val expectedSchema =\n+      AttributeReference(\"arrayOfArray1\", ArrayType(ArrayType(StringType)), true)() ::\n+      AttributeReference(\"arrayOfArray2\", ArrayType(ArrayType(DoubleType)), true)() ::\n+      AttributeReference(\"arrayOfBigInteger\", ArrayType(DecimalType), true)() ::\n+      AttributeReference(\"arrayOfBoolean\", ArrayType(BooleanType), true)() ::\n+      AttributeReference(\"arrayOfDouble\", ArrayType(DoubleType), true)() ::\n+      AttributeReference(\"arrayOfInteger\", ArrayType(IntegerType), true)() ::\n+      AttributeReference(\"arrayOfLong\", ArrayType(LongType), true)() ::\n+      AttributeReference(\"arrayOfNull\", ArrayType(StringType), true)() ::\n+      AttributeReference(\"arrayOfString\", ArrayType(StringType), true)() ::\n+      AttributeReference(\"arrayOfStruct\", ArrayType(\n+        StructType(StructField(\"field1\", BooleanType, true) ::\n+                   StructField(\"field2\", StringType, true) :: Nil)), true)() ::\n+      AttributeReference(\"struct\", StructType(\n+        StructField(\"field1\", BooleanType, true) ::\n+        StructField(\"field2\", DecimalType, true) :: Nil), true)() ::\n+      AttributeReference(\"structWithArrayFields\", StructType(\n+        StructField(\"field1\", ArrayType(IntegerType), true) ::\n+        StructField(\"field2\", ArrayType(StringType), true) :: Nil), true)() :: Nil\n+\n+    checkSchema(expectedSchema, jsonSchemaRDD.logicalPlan.output)\n+\n+    jsonSchemaRDD.registerAsTable(\"jsonTable\")\n+\n+    // Access elements of a primitive array.\n+    checkAnswer(\n+      sql(\"select arrayOfString[0], arrayOfString[1], arrayOfString[2] from jsonTable\"),\n+      (\"str1\", \"str2\", null) :: Nil\n+    )\n+\n+    // Access an array of null values.\n+    checkAnswer(\n+      sql(\"select arrayOfNull from jsonTable\"),\n+      Seq(Seq(null, null, null, null)) :: Nil\n+    )\n+\n+    // Access elements of a BigInteger array (we use DecimalType internally).\n+    checkAnswer(\n+      sql(\"select arrayOfBigInteger[0], arrayOfBigInteger[1], arrayOfBigInteger[2] from jsonTable\"),\n+      (BigDecimal(\"922337203685477580700\"), BigDecimal(\"-922337203685477580800\"), null) :: Nil\n+    )\n+\n+    // Access elements of an array of arrays.\n+    checkAnswer(\n+      sql(\"select arrayOfArray1[0], arrayOfArray1[1] from jsonTable\"),\n+      (Seq(\"1\", \"2\", \"3\"), Seq(\"str1\", \"str2\")) :: Nil\n+    )\n+\n+    // Access elements of an array of arrays.\n+    checkAnswer(\n+      sql(\"select arrayOfArray2[0], arrayOfArray2[1] from jsonTable\"),\n+      (Seq(1.0, 2.0, 3.0), Seq(1.1, 2.1, 3.1)) :: Nil\n+    )\n+\n+    // Access elements of an array inside a filed with the type of ArrayType(ArrayType).\n+    checkAnswer(\n+      sql(\"select arrayOfArray1[1][1], arrayOfArray2[1][1] from jsonTable\"),\n+      (\"str2\", 2.1) :: Nil\n+    )\n+\n+    // Access elements of an array of structs.\n+    checkAnswer(\n+      sql(\"select arrayOfStruct[0], arrayOfStruct[1], arrayOfStruct[2] from jsonTable\"),\n+      (true :: \"str1\" :: Nil, false :: null :: Nil, null) :: Nil\n+    )\n+\n+    /*\n+    // Right now, \"field1\" and \"field2\" are treated as aliases. We should fix it.\n+    // TODO: Re-enable the following test.\n+    checkAnswer(\n+      sql(\"select arrayOfStruct[0].field1, arrayOfStruct[0].field2 from jsonTable\"),\n+      (true, \"str1\") :: Nil\n+    )\n+    */\n+\n+    /*\n+    // Right now, the analyzer cannot resolve arrayOfStruct.field1 and arrayOfStruct.field2.\n+    // TODO: Re-enable the following test.\n+    // Getting all values of a specific field from an array of structs.\n+    checkAnswer(\n+      sql(\"select arrayOfStruct.field1, arrayOfStruct.field2 from jsonTable\"),\n+      (Seq(true, false), Seq(\"str1\", null)) :: Nil\n+    )\n+    */\n+\n+    // Access a struct and fields inside of it.\n+    checkAnswer(\n+      sql(\"select struct, struct.field1, struct.field2 from jsonTable\"),\n+      (\n+        Seq(true, BigDecimal(\"92233720368547758070\")),\n+        true,\n+        BigDecimal(\"92233720368547758070\")) :: Nil\n+    )\n+\n+    // Access an array field of a struct.\n+    checkAnswer(\n+      sql(\"select structWithArrayFields.field1, structWithArrayFields.field2 from jsonTable\"),\n+      (Seq(4, 5, 6), Seq(\"str1\", \"str2\")) :: Nil\n+    )\n+\n+    // Access elements of an array field of a struct.\n+    checkAnswer(\n+      sql(\"select structWithArrayFields.field1[1], structWithArrayFields.field2[3] from jsonTable\"),\n+      (5, null) :: Nil\n+    )\n+  }\n+\n+  test(\"Type conflict in primitive field values\") {\n+    val jsonSchemaRDD = jsonRDD(primitiveFieldValueTypeConflict)\n+\n+    val expectedSchema =\n+      AttributeReference(\"num_bool\", StringType, true)() ::\n+      AttributeReference(\"num_num_1\", LongType, true)() ::\n+      AttributeReference(\"num_num_2\", DecimalType, true)() ::\n+      AttributeReference(\"num_num_3\", DoubleType, true)() ::\n+      AttributeReference(\"num_str\", StringType, true)() ::\n+      AttributeReference(\"str_bool\", StringType, true)() :: Nil\n+\n+    checkSchema(expectedSchema, jsonSchemaRDD.logicalPlan.output)\n+\n+    jsonSchemaRDD.registerAsTable(\"jsonTable\")\n+\n+    checkAnswer(\n+      sql(\"select * from jsonTable\"),\n+      (\"true\", 11L, null, 1.1, \"13.1\", \"str1\") ::\n+      (\"12\", null, BigDecimal(\"21474836470.9\"), null, null, \"true\") ::\n+      (\"false\", 21474836470L, BigDecimal(\"92233720368547758070\"), 100, \"str1\", \"false\") ::\n+      (null, 21474836570L, BigDecimal(1.1), 21474836470L, \"92233720368547758070\", null) :: Nil\n+    )\n+\n+    // Number and Boolean conflict: resolve the type as number in this query.\n+    checkAnswer(\n+      sql(\"select num_bool - 10 from jsonTable where num_bool > 11\"),\n+      2\n+    )\n+\n+    /*\n+    // Right now, the analyzer does not insert a Cast for num_bool.","path":"sql/core/src/test/scala/org/apache/spark/sql/json/JsonSuite.scala","position":228,"original_position":227,"commit_id":"666b95799ee780345e2b39a51203b44550043772","original_commit_id":"f3ce176ef60aeeaba799c4d196975903210dcb6d","user":{"login":"yhuai","id":2072857,"avatar_url":"https://avatars.githubusercontent.com/u/2072857?","gravatar_id":"8155de090e6e23a8a111a6af286b540a","url":"https://api.github.com/users/yhuai","html_url":"https://github.com/yhuai","followers_url":"https://api.github.com/users/yhuai/followers","following_url":"https://api.github.com/users/yhuai/following{/other_user}","gists_url":"https://api.github.com/users/yhuai/gists{/gist_id}","starred_url":"https://api.github.com/users/yhuai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yhuai/subscriptions","organizations_url":"https://api.github.com/users/yhuai/orgs","repos_url":"https://api.github.com/users/yhuai/repos","events_url":"https://api.github.com/users/yhuai/events{/privacy}","received_events_url":"https://api.github.com/users/yhuai/received_events","type":"User","site_admin":false},"body":"In the query, we have a `NOT num_bool`. But, the type of column `num_bool` is `StringType`. Seems the analyzer does not promote strings that appear in boolean expression. ","created_at":"2014-06-10T16:00:00Z","updated_at":"2014-06-10T16:00:00Z","html_url":"https://github.com/apache/spark/pull/999#discussion_r13602167","pull_request_url":"https://api.github.com/repos/apache/spark/pulls/999","_links":{"self":{"href":"https://api.github.com/repos/apache/spark/pulls/comments/13602167"},"html":{"href":"https://github.com/apache/spark/pull/999#discussion_r13602167"},"pull_request":{"href":"https://api.github.com/repos/apache/spark/pulls/999"}}},"pull_request":{"url":"https://api.github.com/repos/apache/spark/pulls/999","id":16841587,"html_url":"https://github.com/apache/spark/pull/999","diff_url":"https://github.com/apache/spark/pull/999.diff","patch_url":"https://github.com/apache/spark/pull/999.patch","issue_url":"https://api.github.com/repos/apache/spark/issues/999","number":999,"state":"open","title":"[Spark 2060][SQL] Querying JSON Datasets with SQL and DSL in Spark SQL","user":{"login":"yhuai","id":2072857,"avatar_url":"https://avatars.githubusercontent.com/u/2072857?","gravatar_id":"8155de090e6e23a8a111a6af286b540a","url":"https://api.github.com/users/yhuai","html_url":"https://github.com/yhuai","followers_url":"https://api.github.com/users/yhuai/followers","following_url":"https://api.github.com/users/yhuai/following{/other_user}","gists_url":"https://api.github.com/users/yhuai/gists{/gist_id}","starred_url":"https://api.github.com/users/yhuai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yhuai/subscriptions","organizations_url":"https://api.github.com/users/yhuai/orgs","repos_url":"https://api.github.com/users/yhuai/repos","events_url":"https://api.github.com/users/yhuai/events{/privacy}","received_events_url":"https://api.github.com/users/yhuai/received_events","type":"User","site_admin":false},"body":"JIRA: https://issues.apache.org/jira/browse/SPARK-2060","created_at":"2014-06-06T20:42:23Z","updated_at":"2014-06-10T16:00:00Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4982463272514b8c7e1d5bfe4ef6dbb4356c7378","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/apache/spark/pulls/999/commits","review_comments_url":"https://api.github.com/repos/apache/spark/pulls/999/comments","review_comment_url":"https://api.github.com/repos/apache/spark/pulls/comments/{number}","comments_url":"https://api.github.com/repos/apache/spark/issues/999/comments","statuses_url":"https://api.github.com/repos/apache/spark/statuses/666b95799ee780345e2b39a51203b44550043772","head":{"label":"yhuai:newJson","ref":"newJson","sha":"666b95799ee780345e2b39a51203b44550043772","user":{"login":"yhuai","id":2072857,"avatar_url":"https://avatars.githubusercontent.com/u/2072857?","gravatar_id":"8155de090e6e23a8a111a6af286b540a","url":"https://api.github.com/users/yhuai","html_url":"https://github.com/yhuai","followers_url":"https://api.github.com/users/yhuai/followers","following_url":"https://api.github.com/users/yhuai/following{/other_user}","gists_url":"https://api.github.com/users/yhuai/gists{/gist_id}","starred_url":"https://api.github.com/users/yhuai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yhuai/subscriptions","organizations_url":"https://api.github.com/users/yhuai/orgs","repos_url":"https://api.github.com/users/yhuai/repos","events_url":"https://api.github.com/users/yhuai/events{/privacy}","received_events_url":"https://api.github.com/users/yhuai/received_events","type":"User","site_admin":false},"repo":{"id":17964653,"name":"spark","full_name":"yhuai/spark","owner":{"login":"yhuai","id":2072857,"avatar_url":"https://avatars.githubusercontent.com/u/2072857?","gravatar_id":"8155de090e6e23a8a111a6af286b540a","url":"https://api.github.com/users/yhuai","html_url":"https://github.com/yhuai","followers_url":"https://api.github.com/users/yhuai/followers","following_url":"https://api.github.com/users/yhuai/following{/other_user}","gists_url":"https://api.github.com/users/yhuai/gists{/gist_id}","starred_url":"https://api.github.com/users/yhuai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yhuai/subscriptions","organizations_url":"https://api.github.com/users/yhuai/orgs","repos_url":"https://api.github.com/users/yhuai/repos","events_url":"https://api.github.com/users/yhuai/events{/privacy}","received_events_url":"https://api.github.com/users/yhuai/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/yhuai/spark","description":"Mirror of Apache Spark","fork":true,"url":"https://api.github.com/repos/yhuai/spark","forks_url":"https://api.github.com/repos/yhuai/spark/forks","keys_url":"https://api.github.com/repos/yhuai/spark/keys{/key_id}","collaborators_url":"https://api.github.com/repos/yhuai/spark/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/yhuai/spark/teams","hooks_url":"https://api.github.com/repos/yhuai/spark/hooks","issue_events_url":"https://api.github.com/repos/yhuai/spark/issues/events{/number}","events_url":"https://api.github.com/repos/yhuai/spark/events","assignees_url":"https://api.github.com/repos/yhuai/spark/assignees{/user}","branches_url":"https://api.github.com/repos/yhuai/spark/branches{/branch}","tags_url":"https://api.github.com/repos/yhuai/spark/tags","blobs_url":"https://api.github.com/repos/yhuai/spark/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/yhuai/spark/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/yhuai/spark/git/refs{/sha}","trees_url":"https://api.github.com/repos/yhuai/spark/git/trees{/sha}","statuses_url":"https://api.github.com/repos/yhuai/spark/statuses/{sha}","languages_url":"https://api.github.com/repos/yhuai/spark/languages","stargazers_url":"https://api.github.com/repos/yhuai/spark/stargazers","contributors_url":"https://api.github.com/repos/yhuai/spark/contributors","subscribers_url":"https://api.github.com/repos/yhuai/spark/subscribers","subscription_url":"https://api.github.com/repos/yhuai/spark/subscription","commits_url":"https://api.github.com/repos/yhuai/spark/commits{/sha}","git_commits_url":"https://api.github.com/repos/yhuai/spark/git/commits{/sha}","comments_url":"https://api.github.com/repos/yhuai/spark/comments{/number}","issue_comment_url":"https://api.github.com/repos/yhuai/spark/issues/comments/{number}","contents_url":"https://api.github.com/repos/yhuai/spark/contents/{+path}","compare_url":"https://api.github.com/repos/yhuai/spark/compare/{base}...{head}","merges_url":"https://api.github.com/repos/yhuai/spark/merges","archive_url":"https://api.github.com/repos/yhuai/spark/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/yhuai/spark/downloads","issues_url":"https://api.github.com/repos/yhuai/spark/issues{/number}","pulls_url":"https://api.github.com/repos/yhuai/spark/pulls{/number}","milestones_url":"https://api.github.com/repos/yhuai/spark/milestones{/number}","notifications_url":"https://api.github.com/repos/yhuai/spark/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/yhuai/spark/labels{/name}","releases_url":"https://api.github.com/repos/yhuai/spark/releases{/id}","created_at":"2014-03-21T01:38:52Z","updated_at":"2014-06-10T00:22:40Z","pushed_at":"2014-06-10T00:22:40Z","git_url":"git://github.com/yhuai/spark.git","ssh_url":"git@github.com:yhuai/spark.git","clone_url":"https://github.com/yhuai/spark.git","svn_url":"https://github.com/yhuai/spark","homepage":null,"size":68857,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":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":"a9ec033c8cf489898cc47e2043bd9e86b7df1ff8","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?","gravatar_id":"a676c0bf448fcd49f588249ead719b4c","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?","gravatar_id":"a676c0bf448fcd49f588249ead719b4c","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}","created_at":"2014-02-25T08:00:08Z","updated_at":"2014-06-10T15:49:45Z","pushed_at":"2014-06-10T15:37:42Z","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":1583235,"stargazers_count":591,"watchers_count":591,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":false,"forks_count":597,"mirror_url":"git://git.apache.org/spark.git","open_issues_count":181,"forks":597,"open_issues":181,"watchers":591,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/spark/pulls/999"},"html":{"href":"https://github.com/apache/spark/pull/999"},"issue":{"href":"https://api.github.com/repos/apache/spark/issues/999"},"comments":{"href":"https://api.github.com/repos/apache/spark/issues/999/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/spark/pulls/999/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/spark/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/apache/spark/pulls/999/commits"},"statuses":{"href":"https://api.github.com/repos/apache/spark/statuses/666b95799ee780345e2b39a51203b44550043772"}}}}