{"action":"created","comment":{"url":"https://api.github.com/repos/HuaweiBigData/astro/pulls/comments/48401308","id":48401308,"diff_hunk":"@@ -0,0 +1,1092 @@\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.hbase\n+\n+import java.io.{DataOutputStream, ObjectOutputStream, ByteArrayOutputStream}\n+\n+import org.apache.hadoop.hbase.util.Bytes\n+import org.apache.spark.Logging\n+import org.apache.spark.sql.catalyst.InternalRow\n+import org.apache.spark.sql.catalyst.expressions.{GenericMutableRow, MutableRow}\n+import org.apache.spark.sql.catalyst.util.DateTimeUtils\n+import org.apache.spark.sql.types._\n+import org.apache.spark.unsafe.types.UTF8String\n+\n+import scala.collection.mutable.{ArrayBuffer, HashMap}\n+\n+object FieldFactory {\n+\n+  val BINARY_FORMAT = \"binaryformat\"\n+  val STRING_FORMAT = \"stringformat\"\n+  val HBASE_FORMAT = \"hbaseformat\"\n+  val COLLECTION_SEPERATOR = \"collectionSeperator\"\n+  val MAPKEY_SEPERATOR = \"mapkeySeperator\"\n+\n+  def collectSeperators(parameters: Map[String, String]) = {\n+    val separatorCandidates: ArrayBuffer[Byte] = new ArrayBuffer[Byte]()\n+    separatorCandidates += getByte(parameters.getOrElse(FieldFactory.COLLECTION_SEPERATOR, null), 2.toByte)\n+    separatorCandidates += getByte(parameters.getOrElse(FieldFactory.MAPKEY_SEPERATOR, null), 3.toByte)\n+\n+    //use only control chars that are very unlikely to be part of the string\n+    // the following might/likely to be used in text files for strings\n+    // 9 (horizontal tab, HT, \\t, ^I)\n+    // 10 (line feed, LF, \\n, ^J),\n+    // 12 (form feed, FF, \\f, ^L),\n+    // 13 (carriage return, CR, \\r, ^M),\n+    // 27 (escape, ESC, \\e [GCC only], ^[).\n+    var b: Byte = 4\n+    for (b <- 4 to 8) {\n+      separatorCandidates += b.toByte\n+    }\n+    separatorCandidates += 11.toByte\n+    for (b <- 14 to 26) {\n+      separatorCandidates += b.toByte\n+    }\n+    for (b <- 28 to 31) {\n+      separatorCandidates += b.toByte\n+    }\n+    for (b <- 128 to -1) {\n+      separatorCandidates += b.toByte\n+    }\n+    separatorCandidates.toArray[Byte]\n+  }\n+\n+  private def getByte(altValue: String, defaultVal: Byte): Byte = {\n+    if (altValue != null && altValue.length > 0) {\n+      try {\n+        return altValue.toByte\n+      }\n+      catch {\n+        case e: NumberFormatException =>\n+          return altValue.charAt(0).toByte\n+      }\n+    }\n+    defaultVal\n+  }\n+\n+  /**\n+   * It creates the fieldData object for corresponding datatype and encoding.\n+   * @param dataType\n+   * @param encodingFormat\n+   * @param separators\n+   * @param level\n+   * @param hiveStore\n+   * @return FieldData\n+   */\n+  def createFieldData(dataType: DataType,\n+                      encodingFormat: String,\n+                      separators: Array[Byte],\n+                      level: Int = 0, hiveStore: Boolean =  false): FieldData = {\n+    encodingFormat match {\n+      case BINARY_FORMAT =>\n+        dataType match {\n+          case ByteType => AstroBinaryFormat.ByteDataField(Bytes.SIZEOF_BYTE, ByteType)\n+          case BooleanType => AstroBinaryFormat.BooleanDataField(Bytes.SIZEOF_BOOLEAN, BooleanType)\n+          case ShortType => AstroBinaryFormat.ShortDataField(Bytes.SIZEOF_SHORT, ShortType)\n+          case IntegerType => AstroBinaryFormat.IntDataField(Bytes.SIZEOF_INT, IntegerType)\n+          case LongType => AstroBinaryFormat.LongDataField(Bytes.SIZEOF_LONG, LongType)\n+          case FloatType => AstroBinaryFormat.FloatDataField(Bytes.SIZEOF_FLOAT, FloatType)\n+          case DoubleType => AstroBinaryFormat.DoubleDataField(Bytes.SIZEOF_DOUBLE, DoubleType)\n+          case DateType => DateDataField(AstroBinaryFormat.IntDataField(Bytes.SIZEOF_INT, IntegerType))\n+          case TimestampType => TimestampDataField(AstroBinaryFormat.LongDataField(Bytes.SIZEOF_LONG, LongType))\n+          case dt: DecimalType => HbaseBinaryFormat.DecimalDataField(dt)\n+          case at: ArrayType => ArrayDataField(at, encodingFormat, separators, level, hiveStore)\n+          case st: StructType => StructDataField(st, encodingFormat, separators, level, hiveStore)\n+          case mt: MapType => MapDataField(mt, encodingFormat, separators, level, hiveStore)\n+          case StringType => StringDataField(StringType)\n+        }\n+      case STRING_FORMAT =>\n+        dataType match {\n+          case ByteType => StringFormat.ByteDataField(Bytes.SIZEOF_BYTE, ByteType)\n+          case BooleanType => StringFormat.BooleanDataField(Bytes.SIZEOF_BOOLEAN, BooleanType)\n+          case ShortType => StringFormat.ShortDataField(Bytes.SIZEOF_SHORT, ShortType)\n+          case IntegerType => StringFormat.IntDataField(Bytes.SIZEOF_INT, IntegerType)\n+          case LongType => StringFormat.LongDataField(Bytes.SIZEOF_LONG, LongType)\n+          case FloatType => StringFormat.FloatDataField(Bytes.SIZEOF_FLOAT, FloatType)\n+          case DoubleType => StringFormat.DoubleDataField(Bytes.SIZEOF_DOUBLE, DoubleType)\n+          case DateType => DateDataField(StringFormat.IntDataField(Bytes.SIZEOF_INT, IntegerType))\n+          case TimestampType => TimestampDataField(StringFormat.LongDataField(Bytes.SIZEOF_LONG, LongType))\n+          case dt: DecimalType => StringFormat.DecimalDataField(dt)\n+          case at: ArrayType => ArrayDataField(at, encodingFormat, separators, level, hiveStore)\n+          case st: StructType => StructDataField(st, encodingFormat, separators, level, hiveStore)\n+          case mt: MapType => MapDataField(mt, encodingFormat, separators, level, hiveStore)\n+          case StringType => StringDataField(StringType)\n+        }\n+      case HBASE_FORMAT =>\n+        dataType match {\n+          case ByteType => HbaseBinaryFormat.ByteDataField(Bytes.SIZEOF_BYTE, ByteType)\n+          case BooleanType => HbaseBinaryFormat.BooleanDataField(Bytes.SIZEOF_BOOLEAN, BooleanType)\n+          case ShortType => HbaseBinaryFormat.ShortDataField(Bytes.SIZEOF_SHORT, ShortType)\n+          case IntegerType => HbaseBinaryFormat.IntDataField(Bytes.SIZEOF_INT, IntegerType)\n+          case LongType => HbaseBinaryFormat.LongDataField(Bytes.SIZEOF_LONG, LongType)\n+          case FloatType => HbaseBinaryFormat.FloatDataField(Bytes.SIZEOF_FLOAT, FloatType)\n+          case DoubleType => HbaseBinaryFormat.DoubleDataField(Bytes.SIZEOF_DOUBLE, DoubleType)\n+          case DateType => DateDataField(HbaseBinaryFormat.IntDataField(Bytes.SIZEOF_INT, IntegerType))\n+          case TimestampType => TimestampDataField(HbaseBinaryFormat.LongDataField(Bytes.SIZEOF_LONG, LongType))\n+          case dt: DecimalType => HbaseBinaryFormat.DecimalDataField(dt)\n+          case at: ArrayType => ArrayDataField(at, encodingFormat, separators, level, hiveStore)\n+          case st: StructType => StructDataField(st, encodingFormat, separators, level, hiveStore)\n+          case mt: MapType => MapDataField(mt, encodingFormat, separators, level, hiveStore)\n+          case StringType => StringDataField(StringType)\n+        }\n+    }\n+  }\n+}\n+\n+/**\n+ * It caches the FieldData objects to avoid creating multiple times.\n+ * @param encodingFormat\n+ * @param separators\n+ * @param hiveStorage\n+ */\n+class FieldDataCache(encodingFormat: String, separators: Array[Byte], hiveStorage: Boolean) extends Serializable {\n+\n+  val cache = new HashMap[DataType, FieldData]\n+\n+  def get(dataType: DataType): FieldData = {\n+    cache.get(dataType) match {\n+      case Some(field) => field\n+      case None =>\n+        val field = FieldFactory.createFieldData(dataType, encodingFormat, separators, 0, hiveStorage)\n+        cache += dataType -> field\n+        field\n+    }\n+  }\n+\n+  def setFields(fieldMap: Map[DataType, FieldData]): Unit = {\n+    cache ++: fieldMap\n+  }\n+\n+}\n+\n+/**\n+ * This interface class for FieldData of all datatypes. This class is responsible for all data parsing,encoding and\n+ * decoding of any particular datatype.\n+ */\n+abstract class FieldData extends Serializable with Logging {\n+\n+  /**\n+   * Basically it would be datatype internal type\n+   */\n+  type InternalType\n+\n+  /**\n+   * It returns raw bytes for give value\n+   * @param value\n+   * @return\n+   */\n+  def getRawBytes(value: InternalType): HBaseRawType\n+\n+  /**\n+   * It returns the value after it decoded from raw bytes to value.\n+   * @param bytes\n+   * @param offset\n+   * @param length\n+   * @return\n+   */\n+  def getValueFromBytes(bytes: HBaseRawType, offset: Int, length: Int): InternalType\n+\n+  /**\n+   * It converts raw bytes to data and set to row.\n+   * @param row\n+   * @param index\n+   * @param src\n+   * @param offset\n+   * @param length\n+   */\n+  def setDataInRow(row: MutableRow, index: Int, src: HBaseRawType, offset: Int, length: Int)\n+\n+  /**\n+   * It retrives data from row and converts it into raw bytes.\n+   * @param row\n+   * @param index\n+   * @return\n+   */\n+  def getRowColumnInHBaseRawType(row: InternalRow, index: Int): HBaseRawType = {\n+    if (row.isNullAt(index)) return new Array[Byte](0)\n+    getRowColumnInHBaseRawTypeInternal(row, index)\n+  }\n+\n+  protected def getRowColumnInHBaseRawTypeInternal(row: InternalRow, index: Int): HBaseRawType\n+\n+  /**\n+   * It parses the String to corresponding datatype value\n+   * @param input\n+   * @return\n+   */\n+  def parseStringToData(input: String): Any = {\n+    input match {\n+      case null => null\n+      case _ =>\n+        try {\n+          parseStringToDataInternal(input)\n+        } catch {\n+          case _: NumberFormatException | _: IllegalArgumentException =>\n+            logWarning(s\"$input can't be converted, set this value to be null.\")\n+            null\n+        }\n+    }\n+  }\n+\n+  protected def parseStringToDataInternal(input: String): InternalType\n+\n+  def parseStringToTypeDataBytes(input: String): HBaseRawType = {\n+    input match {\n+      case null => new Array[Byte](0)\n+      case \"\" => new Array[Byte](0)\n+      case _ =>\n+        try {\n+          getRawBytes(parseStringToDataInternal(input))\n+        } catch {\n+          case e: NumberFormatException =>\n+            // If there is an error of dataType cast, we set this field to be null. And we will\n+            // print the error log outside this function.\n+            new Array[Byte](0)\n+        }\n+    }\n+  }\n+\n+  def getDataStorageFormat: String\n+\n+  protected def getIndex(bytes: HBaseRawType, offset: Int, length: Int, separator: Byte): Int =\n+  {\n+    for(a <- 0 until length )\n+    {\n+      if(bytes(offset+a) == separator) return a\n+    }\n+    -1\n+  }\n+\n+}\n+\n+abstract class PrimitiveDataField extends FieldData {\n+\n+  val length: Int\n+}\n+\n+case class StringDataField(dataType: StringType) extends FieldData {\n+\n+  type InternalType = dataType.InternalType\n+\n+  def setDataInRow(row: MutableRow, index: Int, src: HBaseRawType, offset: Int, length: Int) {\n+    row.update(index, getValueFromBytes(src, offset, length))\n+  }\n+\n+  def getValueFromBytes(bytes: HBaseRawType, offset: Int, length: Int): InternalType = {\n+    UTF8String.fromBytes(bytes, offset, length)\n+  }\n+\n+  def getRowColumnInHBaseRawTypeInternal(row: InternalRow, index: Int): HBaseRawType = {\n+    getRawBytes(UTF8String.fromString(row.getString(index)))\n+  }\n+\n+  def getRawBytes(input: InternalType): HBaseRawType = {\n+    input.getBytes\n+  }\n+\n+  def parseStringToDataInternal(input: String): InternalType = {\n+    UTF8String.fromString(input)\n+  }\n+\n+  def getDataStorageFormat: String = FieldFactory.BINARY_FORMAT\n+}\n+\n+case class ArrayDataField(dataType: ArrayType,\n+                          encodingFormat: String,\n+                          separators: Array[Byte],\n+                          level: Int,\n+                           hiveStorage: Boolean) extends FieldData {","path":"src/main/scala/org/apache/spark/sql/hbase/dataTypeReadWriteObjects.scala","position":313,"original_position":313,"commit_id":"3057f835df260cf2856bfbff39e39e4bdf72aace","original_commit_id":"3057f835df260cf2856bfbff39e39e4bdf72aace","user":{"login":"Sephiroth-Lin","id":10866770,"avatar_url":"https://avatars.githubusercontent.com/u/10866770?v=3","gravatar_id":"","url":"https://api.github.com/users/Sephiroth-Lin","html_url":"https://github.com/Sephiroth-Lin","followers_url":"https://api.github.com/users/Sephiroth-Lin/followers","following_url":"https://api.github.com/users/Sephiroth-Lin/following{/other_user}","gists_url":"https://api.github.com/users/Sephiroth-Lin/gists{/gist_id}","starred_url":"https://api.github.com/users/Sephiroth-Lin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sephiroth-Lin/subscriptions","organizations_url":"https://api.github.com/users/Sephiroth-Lin/orgs","repos_url":"https://api.github.com/users/Sephiroth-Lin/repos","events_url":"https://api.github.com/users/Sephiroth-Lin/events{/privacy}","received_events_url":"https://api.github.com/users/Sephiroth-Lin/received_events","type":"User","site_admin":false},"body":"code style","created_at":"2015-12-24T07:58:01Z","updated_at":"2015-12-24T07:58:01Z","html_url":"https://github.com/HuaweiBigData/astro/pull/49#discussion_r48401308","pull_request_url":"https://api.github.com/repos/HuaweiBigData/astro/pulls/49","_links":{"self":{"href":"https://api.github.com/repos/HuaweiBigData/astro/pulls/comments/48401308"},"html":{"href":"https://github.com/HuaweiBigData/astro/pull/49#discussion_r48401308"},"pull_request":{"href":"https://api.github.com/repos/HuaweiBigData/astro/pulls/49"}}},"pull_request":{"url":"https://api.github.com/repos/HuaweiBigData/astro/pulls/49","id":52567065,"html_url":"https://github.com/HuaweiBigData/astro/pull/49","diff_url":"https://github.com/HuaweiBigData/astro/pull/49.diff","patch_url":"https://github.com/HuaweiBigData/astro/pull/49.patch","issue_url":"https://api.github.com/repos/HuaweiBigData/astro/issues/49","number":49,"state":"open","locked":false,"title":"Supporting Date,timestamp ,Decimal,Struct, Array and Map data types.","user":{"login":"ravipesala","id":8134086,"avatar_url":"https://avatars.githubusercontent.com/u/8134086?v=3","gravatar_id":"","url":"https://api.github.com/users/ravipesala","html_url":"https://github.com/ravipesala","followers_url":"https://api.github.com/users/ravipesala/followers","following_url":"https://api.github.com/users/ravipesala/following{/other_user}","gists_url":"https://api.github.com/users/ravipesala/gists{/gist_id}","starred_url":"https://api.github.com/users/ravipesala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ravipesala/subscriptions","organizations_url":"https://api.github.com/users/ravipesala/orgs","repos_url":"https://api.github.com/users/ravipesala/repos","events_url":"https://api.github.com/users/ravipesala/events{/privacy}","received_events_url":"https://api.github.com/users/ravipesala/received_events","type":"User","site_admin":false},"body":"Following data types are supported in Astro with this PR. Now Astro can support all data types which are supported Astro.\r\n1. Date\r\n2.Timestamp\r\n3.Decimal\r\n4.Struct\r\n5.Array\r\n6.Map\r\n\r\nAnd refactored code to get good maintainability and support complex datatypes.","created_at":"2015-12-03T17:40:08Z","updated_at":"2015-12-24T07:58:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c2a521ff0224e87c23c8443f7ac7751a5a796f1a","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/HuaweiBigData/astro/pulls/49/commits","review_comments_url":"https://api.github.com/repos/HuaweiBigData/astro/pulls/49/comments","review_comment_url":"https://api.github.com/repos/HuaweiBigData/astro/pulls/comments{/number}","comments_url":"https://api.github.com/repos/HuaweiBigData/astro/issues/49/comments","statuses_url":"https://api.github.com/repos/HuaweiBigData/astro/statuses/3057f835df260cf2856bfbff39e39e4bdf72aace","head":{"label":"ravipesala:spark1.5-alpha-ravi","ref":"spark1.5-alpha-ravi","sha":"3057f835df260cf2856bfbff39e39e4bdf72aace","user":{"login":"ravipesala","id":8134086,"avatar_url":"https://avatars.githubusercontent.com/u/8134086?v=3","gravatar_id":"","url":"https://api.github.com/users/ravipesala","html_url":"https://github.com/ravipesala","followers_url":"https://api.github.com/users/ravipesala/followers","following_url":"https://api.github.com/users/ravipesala/following{/other_user}","gists_url":"https://api.github.com/users/ravipesala/gists{/gist_id}","starred_url":"https://api.github.com/users/ravipesala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ravipesala/subscriptions","organizations_url":"https://api.github.com/users/ravipesala/orgs","repos_url":"https://api.github.com/users/ravipesala/repos","events_url":"https://api.github.com/users/ravipesala/events{/privacy}","received_events_url":"https://api.github.com/users/ravipesala/received_events","type":"User","site_admin":false},"repo":{"id":44299243,"name":"astro","full_name":"ravipesala/astro","owner":{"login":"ravipesala","id":8134086,"avatar_url":"https://avatars.githubusercontent.com/u/8134086?v=3","gravatar_id":"","url":"https://api.github.com/users/ravipesala","html_url":"https://github.com/ravipesala","followers_url":"https://api.github.com/users/ravipesala/followers","following_url":"https://api.github.com/users/ravipesala/following{/other_user}","gists_url":"https://api.github.com/users/ravipesala/gists{/gist_id}","starred_url":"https://api.github.com/users/ravipesala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ravipesala/subscriptions","organizations_url":"https://api.github.com/users/ravipesala/orgs","repos_url":"https://api.github.com/users/ravipesala/repos","events_url":"https://api.github.com/users/ravipesala/events{/privacy}","received_events_url":"https://api.github.com/users/ravipesala/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ravipesala/astro","description":"Native, optimized access to HBase Data through Spark SQL/Dataframe Interfaces","fork":true,"url":"https://api.github.com/repos/ravipesala/astro","forks_url":"https://api.github.com/repos/ravipesala/astro/forks","keys_url":"https://api.github.com/repos/ravipesala/astro/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ravipesala/astro/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ravipesala/astro/teams","hooks_url":"https://api.github.com/repos/ravipesala/astro/hooks","issue_events_url":"https://api.github.com/repos/ravipesala/astro/issues/events{/number}","events_url":"https://api.github.com/repos/ravipesala/astro/events","assignees_url":"https://api.github.com/repos/ravipesala/astro/assignees{/user}","branches_url":"https://api.github.com/repos/ravipesala/astro/branches{/branch}","tags_url":"https://api.github.com/repos/ravipesala/astro/tags","blobs_url":"https://api.github.com/repos/ravipesala/astro/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ravipesala/astro/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ravipesala/astro/git/refs{/sha}","trees_url":"https://api.github.com/repos/ravipesala/astro/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ravipesala/astro/statuses/{sha}","languages_url":"https://api.github.com/repos/ravipesala/astro/languages","stargazers_url":"https://api.github.com/repos/ravipesala/astro/stargazers","contributors_url":"https://api.github.com/repos/ravipesala/astro/contributors","subscribers_url":"https://api.github.com/repos/ravipesala/astro/subscribers","subscription_url":"https://api.github.com/repos/ravipesala/astro/subscription","commits_url":"https://api.github.com/repos/ravipesala/astro/commits{/sha}","git_commits_url":"https://api.github.com/repos/ravipesala/astro/git/commits{/sha}","comments_url":"https://api.github.com/repos/ravipesala/astro/comments{/number}","issue_comment_url":"https://api.github.com/repos/ravipesala/astro/issues/comments{/number}","contents_url":"https://api.github.com/repos/ravipesala/astro/contents/{+path}","compare_url":"https://api.github.com/repos/ravipesala/astro/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ravipesala/astro/merges","archive_url":"https://api.github.com/repos/ravipesala/astro/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ravipesala/astro/downloads","issues_url":"https://api.github.com/repos/ravipesala/astro/issues{/number}","pulls_url":"https://api.github.com/repos/ravipesala/astro/pulls{/number}","milestones_url":"https://api.github.com/repos/ravipesala/astro/milestones{/number}","notifications_url":"https://api.github.com/repos/ravipesala/astro/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ravipesala/astro/labels{/name}","releases_url":"https://api.github.com/repos/ravipesala/astro/releases{/id}","created_at":"2015-10-15T06:54:08Z","updated_at":"2015-10-15T07:00:53Z","pushed_at":"2015-12-07T09:29:11Z","git_url":"git://github.com/ravipesala/astro.git","ssh_url":"git@github.com:ravipesala/astro.git","clone_url":"https://github.com/ravipesala/astro.git","svn_url":"https://github.com/ravipesala/astro","homepage":"","size":1428,"stargazers_count":1,"watchers_count":1,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"HuaweiBigData:spark1.5-alpha","ref":"spark1.5-alpha","sha":"42701b8d592efdda63ce199f51b7666fcbf717fe","user":{"login":"HuaweiBigData","id":13159946,"avatar_url":"https://avatars.githubusercontent.com/u/13159946?v=3","gravatar_id":"","url":"https://api.github.com/users/HuaweiBigData","html_url":"https://github.com/HuaweiBigData","followers_url":"https://api.github.com/users/HuaweiBigData/followers","following_url":"https://api.github.com/users/HuaweiBigData/following{/other_user}","gists_url":"https://api.github.com/users/HuaweiBigData/gists{/gist_id}","starred_url":"https://api.github.com/users/HuaweiBigData/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/HuaweiBigData/subscriptions","organizations_url":"https://api.github.com/users/HuaweiBigData/orgs","repos_url":"https://api.github.com/users/HuaweiBigData/repos","events_url":"https://api.github.com/users/HuaweiBigData/events{/privacy}","received_events_url":"https://api.github.com/users/HuaweiBigData/received_events","type":"Organization","site_admin":false},"repo":{"id":42762726,"name":"astro","full_name":"HuaweiBigData/astro","owner":{"login":"HuaweiBigData","id":13159946,"avatar_url":"https://avatars.githubusercontent.com/u/13159946?v=3","gravatar_id":"","url":"https://api.github.com/users/HuaweiBigData","html_url":"https://github.com/HuaweiBigData","followers_url":"https://api.github.com/users/HuaweiBigData/followers","following_url":"https://api.github.com/users/HuaweiBigData/following{/other_user}","gists_url":"https://api.github.com/users/HuaweiBigData/gists{/gist_id}","starred_url":"https://api.github.com/users/HuaweiBigData/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/HuaweiBigData/subscriptions","organizations_url":"https://api.github.com/users/HuaweiBigData/orgs","repos_url":"https://api.github.com/users/HuaweiBigData/repos","events_url":"https://api.github.com/users/HuaweiBigData/events{/privacy}","received_events_url":"https://api.github.com/users/HuaweiBigData/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/HuaweiBigData/astro","description":"Native, optimized access to HBase Data through Spark SQL/Dataframe Interfaces","fork":false,"url":"https://api.github.com/repos/HuaweiBigData/astro","forks_url":"https://api.github.com/repos/HuaweiBigData/astro/forks","keys_url":"https://api.github.com/repos/HuaweiBigData/astro/keys{/key_id}","collaborators_url":"https://api.github.com/repos/HuaweiBigData/astro/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/HuaweiBigData/astro/teams","hooks_url":"https://api.github.com/repos/HuaweiBigData/astro/hooks","issue_events_url":"https://api.github.com/repos/HuaweiBigData/astro/issues/events{/number}","events_url":"https://api.github.com/repos/HuaweiBigData/astro/events","assignees_url":"https://api.github.com/repos/HuaweiBigData/astro/assignees{/user}","branches_url":"https://api.github.com/repos/HuaweiBigData/astro/branches{/branch}","tags_url":"https://api.github.com/repos/HuaweiBigData/astro/tags","blobs_url":"https://api.github.com/repos/HuaweiBigData/astro/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/HuaweiBigData/astro/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/HuaweiBigData/astro/git/refs{/sha}","trees_url":"https://api.github.com/repos/HuaweiBigData/astro/git/trees{/sha}","statuses_url":"https://api.github.com/repos/HuaweiBigData/astro/statuses/{sha}","languages_url":"https://api.github.com/repos/HuaweiBigData/astro/languages","stargazers_url":"https://api.github.com/repos/HuaweiBigData/astro/stargazers","contributors_url":"https://api.github.com/repos/HuaweiBigData/astro/contributors","subscribers_url":"https://api.github.com/repos/HuaweiBigData/astro/subscribers","subscription_url":"https://api.github.com/repos/HuaweiBigData/astro/subscription","commits_url":"https://api.github.com/repos/HuaweiBigData/astro/commits{/sha}","git_commits_url":"https://api.github.com/repos/HuaweiBigData/astro/git/commits{/sha}","comments_url":"https://api.github.com/repos/HuaweiBigData/astro/comments{/number}","issue_comment_url":"https://api.github.com/repos/HuaweiBigData/astro/issues/comments{/number}","contents_url":"https://api.github.com/repos/HuaweiBigData/astro/contents/{+path}","compare_url":"https://api.github.com/repos/HuaweiBigData/astro/compare/{base}...{head}","merges_url":"https://api.github.com/repos/HuaweiBigData/astro/merges","archive_url":"https://api.github.com/repos/HuaweiBigData/astro/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/HuaweiBigData/astro/downloads","issues_url":"https://api.github.com/repos/HuaweiBigData/astro/issues{/number}","pulls_url":"https://api.github.com/repos/HuaweiBigData/astro/pulls{/number}","milestones_url":"https://api.github.com/repos/HuaweiBigData/astro/milestones{/number}","notifications_url":"https://api.github.com/repos/HuaweiBigData/astro/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/HuaweiBigData/astro/labels{/name}","releases_url":"https://api.github.com/repos/HuaweiBigData/astro/releases{/id}","created_at":"2015-09-19T06:35:48Z","updated_at":"2015-12-24T01:27:07Z","pushed_at":"2015-12-07T09:29:11Z","git_url":"git://github.com/HuaweiBigData/astro.git","ssh_url":"git@github.com:HuaweiBigData/astro.git","clone_url":"https://github.com/HuaweiBigData/astro.git","svn_url":"https://github.com/HuaweiBigData/astro","homepage":"","size":1278,"stargazers_count":96,"watchers_count":96,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":89,"mirror_url":null,"open_issues_count":21,"forks":89,"open_issues":21,"watchers":96,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/HuaweiBigData/astro/pulls/49"},"html":{"href":"https://github.com/HuaweiBigData/astro/pull/49"},"issue":{"href":"https://api.github.com/repos/HuaweiBigData/astro/issues/49"},"comments":{"href":"https://api.github.com/repos/HuaweiBigData/astro/issues/49/comments"},"review_comments":{"href":"https://api.github.com/repos/HuaweiBigData/astro/pulls/49/comments"},"review_comment":{"href":"https://api.github.com/repos/HuaweiBigData/astro/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/HuaweiBigData/astro/pulls/49/commits"},"statuses":{"href":"https://api.github.com/repos/HuaweiBigData/astro/statuses/3057f835df260cf2856bfbff39e39e4bdf72aace"}}}}