{"action":"created","comment":{"url":"https://api.github.com/repos/bigdatagenomics/adam/pulls/comments/86828178","pull_request_review_id":7463297,"id":86828178,"diff_hunk":"@@ -0,0 +1,508 @@\n+package org.bdgenomics.adam.hbase\n+\n+import java.util\n+import org.apache.hadoop.hbase.io.ImmutableBytesWritable\n+import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding\n+import org.apache.spark.SparkContext\n+import org.apache.spark.rdd.RDD\n+import org.apache.hadoop.hbase.client._\n+import org.apache.hadoop.hbase._\n+import org.apache.hadoop.hbase.spark._\n+import org.bdgenomics.adam.rdd.variation.{ GenotypeRDD, VariantContextRDD }\n+import org.bdgenomics.adam.rich.RichVariant\n+import org.bdgenomics.formats.avro._\n+import org.apache.hadoop.hbase.spark.HBaseRDDFunctions._\n+import org.apache.hadoop.hbase.util.Bytes\n+import org.apache.hadoop.hbase.{ HBaseConfiguration, TableName }\n+import org.apache.avro.specific.SpecificDatumWriter\n+import org.apache.avro.io._\n+import java.io.ByteArrayOutputStream\n+import org.apache.hadoop.hbase.io.compress.Compression.Algorithm\n+import org.apache.avro.specific.SpecificDatumReader\n+import org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles\n+import org.apache.hadoop.fs.{ FSDataInputStream, FileSystem, Path }\n+import org.bdgenomics.adam.models.{ ReferenceRegion, ReferencePosition, SequenceDictionary, VariantContext }\n+import scala.io.Source\n+\n+import scala.collection.mutable.ListBuffer\n+import sys.process._\n+\n+import scala.collection.JavaConverters._\n+\n+/**\n+ * Created by jp on 7/23/16.\n+ */\n+\n+object HBaseFunctions {\n+\n+  def saveSequenceDictionaryToHBase(hbaseTableName: String,\n+                                    sequences: SequenceDictionary,\n+                                    sequenceDictionaryId: String): Unit = {\n+\n+    val conf = HBaseConfiguration.create()\n+    val connection = ConnectionFactory.createConnection(conf)\n+    val table: Table = connection.getTable(TableName.valueOf(hbaseTableName))\n+    val contigs = sequences.toAvro\n+\n+    val baos: java.io.ByteArrayOutputStream = new ByteArrayOutputStream()\n+    val encoder = EncoderFactory.get().binaryEncoder(baos, null)\n+\n+    contigs.foreach((x) => {\n+      val contigDatumWriter: DatumWriter[Contig] =\n+        new SpecificDatumWriter[Contig](scala.reflect.classTag[Contig].runtimeClass.asInstanceOf[Class[Contig]])\n+      contigDatumWriter.write(x, encoder)\n+    })\n+\n+    encoder.flush()\n+    baos.flush()\n+\n+    val put: Put = new Put(Bytes.toBytes(sequenceDictionaryId))\n+    put.addColumn(Bytes.toBytes(\"meta\"), Bytes.toBytes(\"contigdata\"), baos.toByteArray)\n+    table.put(put)\n+  }\n+\n+  def loadSequenceDictionaryFromHBase(hbaseTableName: String,\n+                                      sequenceDictionaryId: String): SequenceDictionary = {\n+\n+    val conf = HBaseConfiguration.create()\n+    val connection = ConnectionFactory.createConnection(conf)\n+    val table = connection.getTable(TableName.valueOf(hbaseTableName))\n+\n+    val myGet = new Get(Bytes.toBytes(sequenceDictionaryId))\n+    val result = table.get(myGet)\n+    val dataBytes = result.getValue(Bytes.toBytes(\"meta\"), Bytes.toBytes(\"contigdata\"))\n+\n+    val contigDatumReader: DatumReader[Contig] =\n+      new SpecificDatumReader[Contig](scala.reflect.classTag[Contig]\n+        .runtimeClass\n+        .asInstanceOf[Class[Contig]])\n+\n+    val decoder = DecoderFactory.get().binaryDecoder(dataBytes, null)\n+    var resultList = new ListBuffer[Contig]\n+    while (!decoder.isEnd) {\n+      resultList += contigDatumReader.read(null, decoder)\n+    }\n+\n+    SequenceDictionary.fromAvro(resultList)\n+\n+  }\n+\n+  def saveSampleMetadataToHBase(hbaseTableName: String,\n+                                samples: Seq[Sample]): Unit = {\n+\n+    val conf = HBaseConfiguration.create()\n+    val connection = ConnectionFactory.createConnection(conf)\n+    val table = connection.getTable(TableName.valueOf(hbaseTableName))\n+\n+    samples.foreach((x) => {\n+      val baos: java.io.ByteArrayOutputStream = new ByteArrayOutputStream()\n+      val encoder = EncoderFactory.get().binaryEncoder(baos, null)\n+\n+      val sampleDatumWriter: DatumWriter[Sample] =\n+        new SpecificDatumWriter[Sample](scala.reflect.classTag[Sample].runtimeClass.asInstanceOf[Class[Sample]])\n+      sampleDatumWriter.write(x, encoder)\n+      encoder.flush()\n+      baos.flush()\n+\n+      val curr_sampleid = x.getSampleId\n+\n+      val put = new Put(Bytes.toBytes(curr_sampleid))\n+      put.addColumn(Bytes.toBytes(\"meta\"), Bytes.toBytes(\"sampledata\"), baos.toByteArray)\n+      table.put(put)\n+\n+    })\n+  }\n+\n+  def loadSampleMetadataFromHBase(hbaseTableName: String,\n+                                  sampleIds: List[String]): Seq[Sample] = {\n+\n+    val conf = HBaseConfiguration.create()\n+    val connection = ConnectionFactory.createConnection(conf)\n+    val table = connection.getTable(TableName.valueOf(hbaseTableName))\n+\n+    var resultList = new ListBuffer[Sample]\n+\n+    sampleIds.foreach((sampleId) => {\n+      val myGet = new Get(Bytes.toBytes(sampleId))\n+      val result = table.get(myGet)\n+      val dataBytes = result.getValue(Bytes.toBytes(\"meta\"), Bytes.toBytes(\"sampledata\"))\n+\n+      val sampleDatumReader: DatumReader[Sample] =\n+        new SpecificDatumReader[Sample](scala.reflect.classTag[Sample]\n+          .runtimeClass\n+          .asInstanceOf[Class[Sample]])\n+\n+      val decoder = DecoderFactory.get().binaryDecoder(dataBytes, null)\n+\n+      while (!decoder.isEnd) {\n+        resultList += sampleDatumReader.read(null, decoder)\n+      }\n+\n+    })\n+\n+    resultList\n+\n+  }\n+\n+  def loadRDDofGenotypeFromHBase(sc: SparkContext,\n+                                 hbaseTableName: String,\n+                                 sampleIds: List[String],\n+                                 queryRegion: ReferenceRegion = null,\n+                                 numPartitions: Int = 0): RDD[Genotype] = {\n+\n+    val scan = new Scan()\n+    scan.setCaching(100)\n+    scan.setMaxVersions(1)\n+\n+    if (queryRegion != null) {\n+      val start = queryRegion.referenceName + \"_\" + String.format(\"%10s\", queryRegion.start.toString).replace(' ', '0')\n+      val stop = queryRegion.referenceName + \"_\" + String.format(\"%10s\", queryRegion.end.toString).replace(' ', '0')\n+      scan.setStartRow(Bytes.toBytes(start))\n+      scan.setStopRow(Bytes.toBytes(stop))\n+    }\n+\n+    val conf = HBaseConfiguration.create()\n+    val hbaseContext = new HBaseContext(sc, conf)\n+\n+    sampleIds.foreach(sampleId => {\n+      scan.addColumn(Bytes.toBytes(\"g\"), Bytes.toBytes(sampleId))\n+    })\n+\n+    val resultHBaseRDD = hbaseContext.hbaseRDD(TableName.valueOf(hbaseTableName), scan)\n+\n+    val resultHBaseRDDrepar = if (numPartitions > 0) resultHBaseRDD.repartition(numPartitions)\n+    else resultHBaseRDD\n+\n+    val result: RDD[Genotype] = resultHBaseRDDrepar.mapPartitions((iterator) => {\n+\n+      val genotypeDatumReader: DatumReader[Genotype] = new SpecificDatumReader[Genotype](scala.reflect.classTag[Genotype]\n+        .runtimeClass\n+        .asInstanceOf[Class[Genotype]])\n+\n+      iterator.flatMap((curr) => {\n+        var resultList = new ListBuffer[Genotype]\n+        sampleIds.foreach((sample) => {\n+          val myVal: util.List[Cell] = curr._2.getColumnCells(Bytes.toBytes(\"g\"), Bytes.toBytes(sample))\n+          val decoder = DecoderFactory.get().binaryDecoder(CellUtil.cloneValue(myVal.get(0)), null)\n+          while (!decoder.isEnd) {\n+            resultList += genotypeDatumReader.read(null, decoder)\n+          }\n+        })\n+        resultList\n+      })\n+\n+    })\n+    result\n+  }\n+\n+  def loadRDDofVariantContextFromHBase(sc: SparkContext,\n+                                       hbaseTableName: String,\n+                                       inputsampleIds: List[String] = null,\n+                                       sampleListFile: String = null,\n+                                       queryRegion: ReferenceRegion = null,\n+                                       numPartitions: Int = 0): RDD[VariantContext] = {\n+\n+    val scan = new Scan()\n+    scan.setCaching(100)\n+    scan.setMaxVersions(1)\n+\n+    if (queryRegion != null) {\n+      val start = queryRegion.referenceName + \"_\" + String.format(\"%10s\", queryRegion.start.toString).replace(' ', '0')\n+      val stop = queryRegion.referenceName + \"_\" + String.format(\"%10s\", queryRegion.end.toString).replace(' ', '0')\n+      scan.setStartRow(Bytes.toBytes(start))\n+      scan.setStopRow(Bytes.toBytes(stop))\n+    }\n+\n+    val conf = HBaseConfiguration.create()\n+    val hbaseContext = new HBaseContext(sc, conf)\n+\n+    var sampleIds: List[String] = inputsampleIds\n+    if (sampleListFile != null) {\n+      sampleIds = Source.fromFile(sampleListFile).getLines.toList\n+    }\n+\n+    sampleIds.foreach(sampleId => {\n+      scan.addColumn(Bytes.toBytes(\"g\"), Bytes.toBytes(sampleId))\n+    })\n+\n+    val resultHBaseRDD = hbaseContext.hbaseRDD(TableName.valueOf(hbaseTableName), scan)\n+\n+    val resultHBaseRDDrepar = if (numPartitions > 0) resultHBaseRDD.repartition(numPartitions)\n+    else resultHBaseRDD\n+\n+    val result: RDD[VariantContext] = resultHBaseRDDrepar.mapPartitions((iterator) => {\n+\n+      val genotypeDatumReader: DatumReader[Genotype] = new SpecificDatumReader[Genotype](scala.reflect.classTag[Genotype]\n+        .runtimeClass\n+        .asInstanceOf[Class[Genotype]])\n+\n+      iterator.map((curr) => {\n+        var resultList = new ListBuffer[Genotype]\n+        sampleIds.foreach((sample) => {\n+          val myVal = curr._2.getColumnCells(Bytes.toBytes(\"g\"), Bytes.toBytes(sample))\n+          val decoder = DecoderFactory.get().binaryDecoder(CellUtil.cloneValue(myVal.get(0)), null)\n+          while (!decoder.isEnd) {\n+            resultList += genotypeDatumReader.read(null, decoder)\n+          }\n+        })\n+\n+        resultList\n+        val x = resultList.toList\n+\n+        val firstGenotype: Genotype = x.head\n+        val currVar: RichVariant = RichVariant.genotypeToRichVariant(firstGenotype)\n+        val currRefPos = ReferencePosition(currVar.variant.getContigName, currVar.variant.getStart)\n+\n+        val currVariantContext: VariantContext = new VariantContext(currRefPos, currVar, x)\n+        currVariantContext\n+      })\n+\n+    })\n+\n+    result\n+\n+  }\n+\n+  def createHBaseGenotypeTable(hbaseTableName: String, splitsFileName: String): Unit = {\n+    val conf = HBaseConfiguration.create()\n+\n+    val connection = ConnectionFactory.createConnection(conf)\n+\n+    val admin = connection.getAdmin\n+\n+    val tableDescriptor = new HTableDescriptor(TableName.valueOf(hbaseTableName))\n+    tableDescriptor.addFamily(new HColumnDescriptor(\"g\".getBytes()).setCompressionType(Algorithm.GZ)\n+      .setDataBlockEncoding(DataBlockEncoding.FAST_DIFF)\n+      .setMaxVersions(1))\n+\n+    val splits: Array[Array[Byte]] = Source.fromFile(splitsFileName).getLines.toArray\n+      .map(x => x.split(\" \"))\n+      .map(g => Bytes.toBytes(g(0) + \"_\"\n+        + String.format(\"%10s\", g(1).toString).replace(' ', '0')))\n+\n+    admin.createTable(tableDescriptor, splits)\n+\n+    val hbaseTableName_meta = hbaseTableName + \"_meta\"\n+\n+    val tableDescriptor_meta = new HTableDescriptor(TableName.valueOf(hbaseTableName_meta))\n+    tableDescriptor_meta.addFamily(new HColumnDescriptor(\"meta\".getBytes())\n+      .setCompressionType(Algorithm.GZ)\n+      .setDataBlockEncoding(DataBlockEncoding.FAST_DIFF)\n+      .setMaxVersions(1))\n+    admin.createTable(tableDescriptor_meta)\n+  }\n+\n+  def saveVariantContextRDDToHBase(sc: SparkContext,","path":"adam-core/src/main/scala/org/bdgenomics/adam/hbase/HBaseFunctions.scala","position":295,"original_position":295,"commit_id":"56dee61d57d5af1b23f1d958ea26ffb2d45f8841","original_commit_id":"56dee61d57d5af1b23f1d958ea26ffb2d45f8841","user":{"login":"heuermh","id":35293,"avatar_url":"https://avatars.githubusercontent.com/u/35293?v=3","gravatar_id":"","url":"https://api.github.com/users/heuermh","html_url":"https://github.com/heuermh","followers_url":"https://api.github.com/users/heuermh/followers","following_url":"https://api.github.com/users/heuermh/following{/other_user}","gists_url":"https://api.github.com/users/heuermh/gists{/gist_id}","starred_url":"https://api.github.com/users/heuermh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/heuermh/subscriptions","organizations_url":"https://api.github.com/users/heuermh/orgs","repos_url":"https://api.github.com/users/heuermh/repos","events_url":"https://api.github.com/users/heuermh/events{/privacy}","received_events_url":"https://api.github.com/users/heuermh/received_events","type":"User","site_admin":false},"body":"add method doc; change method name to `saveVariantContextsToHBase`; possibly limit visibility to package-private","created_at":"2016-11-07T17:45:10Z","updated_at":"2016-11-07T17:45:10Z","html_url":"https://github.com/bigdatagenomics/adam/pull/1246#discussion_r86828178","pull_request_url":"https://api.github.com/repos/bigdatagenomics/adam/pulls/1246","_links":{"self":{"href":"https://api.github.com/repos/bigdatagenomics/adam/pulls/comments/86828178"},"html":{"href":"https://github.com/bigdatagenomics/adam/pull/1246#discussion_r86828178"},"pull_request":{"href":"https://api.github.com/repos/bigdatagenomics/adam/pulls/1246"}}},"pull_request":{"url":"https://api.github.com/repos/bigdatagenomics/adam/pulls/1246","id":92626703,"html_url":"https://github.com/bigdatagenomics/adam/pull/1246","diff_url":"https://github.com/bigdatagenomics/adam/pull/1246.diff","patch_url":"https://github.com/bigdatagenomics/adam/pull/1246.patch","issue_url":"https://api.github.com/repos/bigdatagenomics/adam/issues/1246","number":1246,"state":"open","locked":false,"title":"HBase backend for Genotypes","user":{"login":"jpdna","id":7423296,"avatar_url":"https://avatars.githubusercontent.com/u/7423296?v=3","gravatar_id":"","url":"https://api.github.com/users/jpdna","html_url":"https://github.com/jpdna","followers_url":"https://api.github.com/users/jpdna/followers","following_url":"https://api.github.com/users/jpdna/following{/other_user}","gists_url":"https://api.github.com/users/jpdna/gists{/gist_id}","starred_url":"https://api.github.com/users/jpdna/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jpdna/subscriptions","organizations_url":"https://api.github.com/users/jpdna/orgs","repos_url":"https://api.github.com/users/jpdna/repos","events_url":"https://api.github.com/users/jpdna/events{/privacy}","received_events_url":"https://api.github.com/users/jpdna/received_events","type":"User","site_admin":false},"body":"Requesting here a first pass review for the integration of HBase input and output functions into Master.\r\n\r\nThe code in this PR excludes the \"custom encoding\" options for clarity and thus sticks with saving the full Avro schema of a Genotype as the values stored in HBase.\r\n\r\nTodo:\r\n- [ ] Add Unit tests using an embedded mini-hbase cluster\r\n- [ ] Add more parameter checking and informative error messages, such as if database table doesn't exist\r\n- [ ] Integrate and rebase against upcoming changes to Genotype schemas when available\r\n\r\nQuestions:\r\n- This PR has a new hbase/HBaseFunctions.scala module parallel to RDD in the package structure in adam-core, is this OK, or other suggestions?\r\n\r\n- For the first round of HBase code integration I suggest we target CDH HBase only as that is where we are doing testing and deployment.  In future we can add a profile for POM for  Apache Hbase 2.0, though this  would seem to require use of HBase 2.0 snapshot as Spark support doesn't exist in the last official non-cloudera apache release.\r\n\r\n\r\n\r\n","created_at":"2016-11-07T17:24:02Z","updated_at":"2016-11-07T18:02:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f8aac4ff958d24d171e0a7edf3fe9bc92d6589b7","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/bigdatagenomics/adam/pulls/1246/commits","review_comments_url":"https://api.github.com/repos/bigdatagenomics/adam/pulls/1246/comments","review_comment_url":"https://api.github.com/repos/bigdatagenomics/adam/pulls/comments{/number}","comments_url":"https://api.github.com/repos/bigdatagenomics/adam/issues/1246/comments","statuses_url":"https://api.github.com/repos/bigdatagenomics/adam/statuses/56dee61d57d5af1b23f1d958ea26ffb2d45f8841","head":{"label":"jpdna:dev/hbase/b3","ref":"dev/hbase/b3","sha":"56dee61d57d5af1b23f1d958ea26ffb2d45f8841","user":{"login":"jpdna","id":7423296,"avatar_url":"https://avatars.githubusercontent.com/u/7423296?v=3","gravatar_id":"","url":"https://api.github.com/users/jpdna","html_url":"https://github.com/jpdna","followers_url":"https://api.github.com/users/jpdna/followers","following_url":"https://api.github.com/users/jpdna/following{/other_user}","gists_url":"https://api.github.com/users/jpdna/gists{/gist_id}","starred_url":"https://api.github.com/users/jpdna/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jpdna/subscriptions","organizations_url":"https://api.github.com/users/jpdna/orgs","repos_url":"https://api.github.com/users/jpdna/repos","events_url":"https://api.github.com/users/jpdna/events{/privacy}","received_events_url":"https://api.github.com/users/jpdna/received_events","type":"User","site_admin":false},"repo":{"id":31505326,"name":"adam","full_name":"jpdna/adam","owner":{"login":"jpdna","id":7423296,"avatar_url":"https://avatars.githubusercontent.com/u/7423296?v=3","gravatar_id":"","url":"https://api.github.com/users/jpdna","html_url":"https://github.com/jpdna","followers_url":"https://api.github.com/users/jpdna/followers","following_url":"https://api.github.com/users/jpdna/following{/other_user}","gists_url":"https://api.github.com/users/jpdna/gists{/gist_id}","starred_url":"https://api.github.com/users/jpdna/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jpdna/subscriptions","organizations_url":"https://api.github.com/users/jpdna/orgs","repos_url":"https://api.github.com/users/jpdna/repos","events_url":"https://api.github.com/users/jpdna/events{/privacy}","received_events_url":"https://api.github.com/users/jpdna/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jpdna/adam","description":"A genomics processing engine and specialized file format built using Apache Avro, Apache Spark and Parquet. Apache 2 licensed.","fork":true,"url":"https://api.github.com/repos/jpdna/adam","forks_url":"https://api.github.com/repos/jpdna/adam/forks","keys_url":"https://api.github.com/repos/jpdna/adam/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jpdna/adam/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jpdna/adam/teams","hooks_url":"https://api.github.com/repos/jpdna/adam/hooks","issue_events_url":"https://api.github.com/repos/jpdna/adam/issues/events{/number}","events_url":"https://api.github.com/repos/jpdna/adam/events","assignees_url":"https://api.github.com/repos/jpdna/adam/assignees{/user}","branches_url":"https://api.github.com/repos/jpdna/adam/branches{/branch}","tags_url":"https://api.github.com/repos/jpdna/adam/tags","blobs_url":"https://api.github.com/repos/jpdna/adam/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jpdna/adam/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jpdna/adam/git/refs{/sha}","trees_url":"https://api.github.com/repos/jpdna/adam/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jpdna/adam/statuses/{sha}","languages_url":"https://api.github.com/repos/jpdna/adam/languages","stargazers_url":"https://api.github.com/repos/jpdna/adam/stargazers","contributors_url":"https://api.github.com/repos/jpdna/adam/contributors","subscribers_url":"https://api.github.com/repos/jpdna/adam/subscribers","subscription_url":"https://api.github.com/repos/jpdna/adam/subscription","commits_url":"https://api.github.com/repos/jpdna/adam/commits{/sha}","git_commits_url":"https://api.github.com/repos/jpdna/adam/git/commits{/sha}","comments_url":"https://api.github.com/repos/jpdna/adam/comments{/number}","issue_comment_url":"https://api.github.com/repos/jpdna/adam/issues/comments{/number}","contents_url":"https://api.github.com/repos/jpdna/adam/contents/{+path}","compare_url":"https://api.github.com/repos/jpdna/adam/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jpdna/adam/merges","archive_url":"https://api.github.com/repos/jpdna/adam/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jpdna/adam/downloads","issues_url":"https://api.github.com/repos/jpdna/adam/issues{/number}","pulls_url":"https://api.github.com/repos/jpdna/adam/pulls{/number}","milestones_url":"https://api.github.com/repos/jpdna/adam/milestones{/number}","notifications_url":"https://api.github.com/repos/jpdna/adam/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jpdna/adam/labels{/name}","releases_url":"https://api.github.com/repos/jpdna/adam/releases{/id}","deployments_url":"https://api.github.com/repos/jpdna/adam/deployments","created_at":"2015-03-01T18:08:13Z","updated_at":"2016-02-21T02:26:10Z","pushed_at":"2016-11-07T17:06:36Z","git_url":"git://github.com/jpdna/adam.git","ssh_url":"git@github.com:jpdna/adam.git","clone_url":"https://github.com/jpdna/adam.git","svn_url":"https://github.com/jpdna/adam","homepage":"http://bdgenomics.org/","size":6012,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"bigdatagenomics:master","ref":"master","sha":"9222c3edd7b24c9f9e859f10223dd29d515b4903","user":{"login":"bigdatagenomics","id":5839438,"avatar_url":"https://avatars.githubusercontent.com/u/5839438?v=3","gravatar_id":"","url":"https://api.github.com/users/bigdatagenomics","html_url":"https://github.com/bigdatagenomics","followers_url":"https://api.github.com/users/bigdatagenomics/followers","following_url":"https://api.github.com/users/bigdatagenomics/following{/other_user}","gists_url":"https://api.github.com/users/bigdatagenomics/gists{/gist_id}","starred_url":"https://api.github.com/users/bigdatagenomics/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bigdatagenomics/subscriptions","organizations_url":"https://api.github.com/users/bigdatagenomics/orgs","repos_url":"https://api.github.com/users/bigdatagenomics/repos","events_url":"https://api.github.com/users/bigdatagenomics/events{/privacy}","received_events_url":"https://api.github.com/users/bigdatagenomics/received_events","type":"Organization","site_admin":false},"repo":{"id":14541530,"name":"adam","full_name":"bigdatagenomics/adam","owner":{"login":"bigdatagenomics","id":5839438,"avatar_url":"https://avatars.githubusercontent.com/u/5839438?v=3","gravatar_id":"","url":"https://api.github.com/users/bigdatagenomics","html_url":"https://github.com/bigdatagenomics","followers_url":"https://api.github.com/users/bigdatagenomics/followers","following_url":"https://api.github.com/users/bigdatagenomics/following{/other_user}","gists_url":"https://api.github.com/users/bigdatagenomics/gists{/gist_id}","starred_url":"https://api.github.com/users/bigdatagenomics/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bigdatagenomics/subscriptions","organizations_url":"https://api.github.com/users/bigdatagenomics/orgs","repos_url":"https://api.github.com/users/bigdatagenomics/repos","events_url":"https://api.github.com/users/bigdatagenomics/events{/privacy}","received_events_url":"https://api.github.com/users/bigdatagenomics/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/bigdatagenomics/adam","description":"ADAM is a genomics analysis platform with specialized file formats built using Apache Avro, Apache Spark and Parquet. Apache 2 licensed.","fork":false,"url":"https://api.github.com/repos/bigdatagenomics/adam","forks_url":"https://api.github.com/repos/bigdatagenomics/adam/forks","keys_url":"https://api.github.com/repos/bigdatagenomics/adam/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bigdatagenomics/adam/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bigdatagenomics/adam/teams","hooks_url":"https://api.github.com/repos/bigdatagenomics/adam/hooks","issue_events_url":"https://api.github.com/repos/bigdatagenomics/adam/issues/events{/number}","events_url":"https://api.github.com/repos/bigdatagenomics/adam/events","assignees_url":"https://api.github.com/repos/bigdatagenomics/adam/assignees{/user}","branches_url":"https://api.github.com/repos/bigdatagenomics/adam/branches{/branch}","tags_url":"https://api.github.com/repos/bigdatagenomics/adam/tags","blobs_url":"https://api.github.com/repos/bigdatagenomics/adam/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bigdatagenomics/adam/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bigdatagenomics/adam/git/refs{/sha}","trees_url":"https://api.github.com/repos/bigdatagenomics/adam/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bigdatagenomics/adam/statuses/{sha}","languages_url":"https://api.github.com/repos/bigdatagenomics/adam/languages","stargazers_url":"https://api.github.com/repos/bigdatagenomics/adam/stargazers","contributors_url":"https://api.github.com/repos/bigdatagenomics/adam/contributors","subscribers_url":"https://api.github.com/repos/bigdatagenomics/adam/subscribers","subscription_url":"https://api.github.com/repos/bigdatagenomics/adam/subscription","commits_url":"https://api.github.com/repos/bigdatagenomics/adam/commits{/sha}","git_commits_url":"https://api.github.com/repos/bigdatagenomics/adam/git/commits{/sha}","comments_url":"https://api.github.com/repos/bigdatagenomics/adam/comments{/number}","issue_comment_url":"https://api.github.com/repos/bigdatagenomics/adam/issues/comments{/number}","contents_url":"https://api.github.com/repos/bigdatagenomics/adam/contents/{+path}","compare_url":"https://api.github.com/repos/bigdatagenomics/adam/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bigdatagenomics/adam/merges","archive_url":"https://api.github.com/repos/bigdatagenomics/adam/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bigdatagenomics/adam/downloads","issues_url":"https://api.github.com/repos/bigdatagenomics/adam/issues{/number}","pulls_url":"https://api.github.com/repos/bigdatagenomics/adam/pulls{/number}","milestones_url":"https://api.github.com/repos/bigdatagenomics/adam/milestones{/number}","notifications_url":"https://api.github.com/repos/bigdatagenomics/adam/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bigdatagenomics/adam/labels{/name}","releases_url":"https://api.github.com/repos/bigdatagenomics/adam/releases{/id}","deployments_url":"https://api.github.com/repos/bigdatagenomics/adam/deployments","created_at":"2013-11-19T23:47:57Z","updated_at":"2016-11-07T09:48:08Z","pushed_at":"2016-11-07T17:24:02Z","git_url":"git://github.com/bigdatagenomics/adam.git","ssh_url":"git@github.com:bigdatagenomics/adam.git","clone_url":"https://github.com/bigdatagenomics/adam.git","svn_url":"https://github.com/bigdatagenomics/adam","homepage":"http://bdgenomics.org/","size":54193,"stargazers_count":542,"watchers_count":542,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":198,"mirror_url":null,"open_issues_count":100,"forks":198,"open_issues":100,"watchers":542,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/bigdatagenomics/adam/pulls/1246"},"html":{"href":"https://github.com/bigdatagenomics/adam/pull/1246"},"issue":{"href":"https://api.github.com/repos/bigdatagenomics/adam/issues/1246"},"comments":{"href":"https://api.github.com/repos/bigdatagenomics/adam/issues/1246/comments"},"review_comments":{"href":"https://api.github.com/repos/bigdatagenomics/adam/pulls/1246/comments"},"review_comment":{"href":"https://api.github.com/repos/bigdatagenomics/adam/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/bigdatagenomics/adam/pulls/1246/commits"},"statuses":{"href":"https://api.github.com/repos/bigdatagenomics/adam/statuses/56dee61d57d5af1b23f1d958ea26ffb2d45f8841"}}}}
{"actor":{"display_login":"heuermh"}}