{"action":"created","comment":{"url":"https://api.github.com/repos/snowplow/snowplow/pulls/comments/99348422","pull_request_review_id":20024325,"id":99348422,"diff_hunk":"@@ -0,0 +1,173 @@\n+/*\n+ * Copyright (c) 2012-2017 Snowplow Analytics Ltd. All rights reserved.\n+ *\n+ * This program is licensed to you under the Apache License Version 2.0,\n+ * and you may not use this file except in compliance with the Apache License Version 2.0.\n+ * You may obtain a copy of the Apache License Version 2.0 at\n+ * http://www.apache.org/licenses/LICENSE-2.0.\n+ *\n+ * Unless required by applicable law or agreed to in writing,\n+ * software distributed under the Apache License Version 2.0 is distributed on an\n+ * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the Apache License Version 2.0 for the specific language governing permissions and\n+ * limitations there under.\n+ */\n+package com.snowplowanalytics.snowplow.enrich\n+package spark\n+\n+// Apache commons\n+import org.apache.commons.codec.binary.Base64\n+\n+// Scalaz\n+import scalaz._\n+import Scalaz._\n+\n+// Spark\n+import org.apache.spark.{SparkConf, SparkContext}\n+import org.apache.spark.rdd.RDD\n+import org.apache.spark.serializer.KryoSerializer\n+import org.apache.spark.sql.{Encoders, SparkSession}\n+import org.apache.spark.sql.functions.col\n+\n+// Snowplow\n+import common.{EtlPipeline, FatalEtlError, ValidatedEnrichedEvent}\n+import common.loaders.{Loader, ThriftLoader}\n+import common.outputs.{BadRow, EnrichedEvent}\n+\n+object EnrichJob extends SparkJob {\n+  private[spark] val classesToRegister: Array[Class[_]] = Array(\n+    classOf[Array[String]],\n+    classOf[Array[Array[Byte]]],\n+    classOf[EnrichedEvent],\n+    classOf[scala.collection.immutable.Map$EmptyMap$],\n+    classOf[scala.collection.immutable.Set$EmptySet$],\n+    classOf[scala.collection.mutable.WrappedArray$ofRef],\n+    classOf[org.apache.spark.internal.io.FileCommitProtocol$TaskCommitMessage]\n+  )\n+  override def sparkConfig(): SparkConf = new SparkConf()\n+    .setAppName(getClass().getSimpleName())\n+    .setIfMissing(\"spark.master\", \"local[*]\")\n+    .set(\"spark.serializer\", classOf[KryoSerializer].getName())\n+    .set(\"spark.kryo.registrationRequired\", \"true\")\n+    .registerKryoClasses(classesToRegister)\n+\n+  override def run(spark: SparkSession, args: Array[String]): Unit = {\n+    val job = EnrichJob(spark, args)\n+    job.run()\n+  }\n+\n+  def apply(spark: SparkSession, args: Array[String]) = new EnrichJob(spark, args)\n+\n+  val etlVersion = s\"spark-${generated.ProjectSettings.version}\"\n+\n+  /**\n+   * Project our Failures into a List of Nel of strings.\n+   * @param all A List of Validations each containing either an EnrichedEvent or Failure strings\n+   * @return A (possibly empty) List of failures, where each failure is a Nel of strings\n+   */\n+  def projectBads(all: List[ValidatedEnrichedEvent]): List[NonEmptyList[String]] =\n+    all.collect { case Failure(errs) => errs }\n+\n+  /**\n+   * Project our Sucesses into EnrichedEvents.\n+   * @param all A List of Validations each containing either an EnrichedEvent or Failure strings\n+   * @return A (possibly empty) List of EnrichedEvent\n+   */\n+  def projectGoods(all: List[ValidatedEnrichedEvent]): List[EnrichedEvent] =\n+    all.collect { case Success(e) => e }\n+}\n+\n+/**\n+ * The Snowplow Enrich job, written in Spark.\n+ * @param spark Spark session used throughout the job\n+ * @param args Command line arguments for the enrich job\n+ */\n+class EnrichJob(@transient val spark: SparkSession, args: Array[String]) extends Serializable {\n+  @transient private val sc: SparkContext = spark.sparkContext\n+  import spark.implicits._\n+\n+  // Necessary to be able to deal with LZO-compressed files\n+  @transient private val hadoopConfig = sc.hadoopConfiguration\n+  hadoopConfig.set(\"io.compression.codecs\", classOf[com.hadoop.compression.lzo.LzopCodec].getName())\n+  hadoopConfig.set(\"io.compression.codec.lzo.class\",\n+    classOf[com.hadoop.compression.lzo.LzoCodec].getName())\n+\n+  // Job configuration\n+  private val enrichConfig = EnrichJobConfig.loadConfigFrom(args).fold(\n+    e => throw FatalEtlError(e.map(_.toString)),\n+    identity\n+  )\n+\n+  def run(): Unit = {\n+    import EnrichJob._\n+    import singleton._\n+\n+    // Install MaxMind file(s) if we have them\n+    enrichConfig.filesToCache.foreach { case (uri, filename) => sc.addFile(uri.toString) }","path":"3-enrich/spark-enrich/src/main/scala/com.snowplowanalytics.snowplow.enrich.spark/EnrichJob.scala","position":106,"original_position":106,"commit_id":"a223caa5117984d7501cb1be277881b465848778","original_commit_id":"a223caa5117984d7501cb1be277881b465848778","user":{"login":"BenFradet","id":1737211,"avatar_url":"https://avatars.githubusercontent.com/u/1737211?v=3","gravatar_id":"","url":"https://api.github.com/users/BenFradet","html_url":"https://github.com/BenFradet","followers_url":"https://api.github.com/users/BenFradet/followers","following_url":"https://api.github.com/users/BenFradet/following{/other_user}","gists_url":"https://api.github.com/users/BenFradet/gists{/gist_id}","starred_url":"https://api.github.com/users/BenFradet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BenFradet/subscriptions","organizations_url":"https://api.github.com/users/BenFradet/orgs","repos_url":"https://api.github.com/users/BenFradet/repos","events_url":"https://api.github.com/users/BenFradet/events{/privacy}","received_events_url":"https://api.github.com/users/BenFradet/received_events","type":"User","site_admin":false},"body":"Welp the problem with my approach I don't have any control over where the files will be stored on each node (/tmp most likely).","created_at":"2017-02-03T14:39:20Z","updated_at":"2017-02-03T14:39:20Z","html_url":"https://github.com/snowplow/snowplow/pull/3077#discussion_r99348422","pull_request_url":"https://api.github.com/repos/snowplow/snowplow/pulls/3077","_links":{"self":{"href":"https://api.github.com/repos/snowplow/snowplow/pulls/comments/99348422"},"html":{"href":"https://github.com/snowplow/snowplow/pull/3077#discussion_r99348422"},"pull_request":{"href":"https://api.github.com/repos/snowplow/snowplow/pulls/3077"}}},"pull_request":{"url":"https://api.github.com/repos/snowplow/snowplow/pulls/3077","id":103115291,"html_url":"https://github.com/snowplow/snowplow/pull/3077","diff_url":"https://github.com/snowplow/snowplow/pull/3077.diff","patch_url":"https://github.com/snowplow/snowplow/pull/3077.patch","issue_url":"https://api.github.com/repos/snowplow/snowplow/issues/3077","number":3077,"state":"open","locked":false,"title":"Spark Enrich","user":{"login":"BenFradet","id":1737211,"avatar_url":"https://avatars.githubusercontent.com/u/1737211?v=3","gravatar_id":"","url":"https://api.github.com/users/BenFradet","html_url":"https://github.com/BenFradet","followers_url":"https://api.github.com/users/BenFradet/followers","following_url":"https://api.github.com/users/BenFradet/following{/other_user}","gists_url":"https://api.github.com/users/BenFradet/gists{/gist_id}","starred_url":"https://api.github.com/users/BenFradet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BenFradet/subscriptions","organizations_url":"https://api.github.com/users/BenFradet/orgs","repos_url":"https://api.github.com/users/BenFradet/repos","events_url":"https://api.github.com/users/BenFradet/events{/privacy}","received_events_url":"https://api.github.com/users/BenFradet/received_events","type":"User","site_admin":false},"body":"","created_at":"2017-01-25T13:07:52Z","updated_at":"2017-02-03T14:39:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c4ca03406348705d10f426f01ad58e2961cc6621","assignee":{"login":"BenFradet","id":1737211,"avatar_url":"https://avatars.githubusercontent.com/u/1737211?v=3","gravatar_id":"","url":"https://api.github.com/users/BenFradet","html_url":"https://github.com/BenFradet","followers_url":"https://api.github.com/users/BenFradet/followers","following_url":"https://api.github.com/users/BenFradet/following{/other_user}","gists_url":"https://api.github.com/users/BenFradet/gists{/gist_id}","starred_url":"https://api.github.com/users/BenFradet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BenFradet/subscriptions","organizations_url":"https://api.github.com/users/BenFradet/orgs","repos_url":"https://api.github.com/users/BenFradet/repos","events_url":"https://api.github.com/users/BenFradet/events{/privacy}","received_events_url":"https://api.github.com/users/BenFradet/received_events","type":"User","site_admin":false},"assignees":[{"login":"BenFradet","id":1737211,"avatar_url":"https://avatars.githubusercontent.com/u/1737211?v=3","gravatar_id":"","url":"https://api.github.com/users/BenFradet","html_url":"https://github.com/BenFradet","followers_url":"https://api.github.com/users/BenFradet/followers","following_url":"https://api.github.com/users/BenFradet/following{/other_user}","gists_url":"https://api.github.com/users/BenFradet/gists{/gist_id}","starred_url":"https://api.github.com/users/BenFradet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BenFradet/subscriptions","organizations_url":"https://api.github.com/users/BenFradet/orgs","repos_url":"https://api.github.com/users/BenFradet/repos","events_url":"https://api.github.com/users/BenFradet/events{/privacy}","received_events_url":"https://api.github.com/users/BenFradet/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/snowplow/snowplow/milestones/137","html_url":"https://github.com/snowplow/snowplow/milestone/137","labels_url":"https://api.github.com/repos/snowplow/snowplow/milestones/137/labels","id":2224820,"number":137,"title":"R9x [HAD] Spark port","description":"","creator":{"login":"alexanderdean","id":200511,"avatar_url":"https://avatars.githubusercontent.com/u/200511?v=3","gravatar_id":"","url":"https://api.github.com/users/alexanderdean","html_url":"https://github.com/alexanderdean","followers_url":"https://api.github.com/users/alexanderdean/followers","following_url":"https://api.github.com/users/alexanderdean/following{/other_user}","gists_url":"https://api.github.com/users/alexanderdean/gists{/gist_id}","starred_url":"https://api.github.com/users/alexanderdean/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexanderdean/subscriptions","organizations_url":"https://api.github.com/users/alexanderdean/orgs","repos_url":"https://api.github.com/users/alexanderdean/repos","events_url":"https://api.github.com/users/alexanderdean/events{/privacy}","received_events_url":"https://api.github.com/users/alexanderdean/received_events","type":"User","site_admin":false},"open_issues":31,"closed_issues":0,"state":"open","created_at":"2017-01-03T10:42:24Z","updated_at":"2017-02-03T12:15:46Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/snowplow/snowplow/pulls/3077/commits","review_comments_url":"https://api.github.com/repos/snowplow/snowplow/pulls/3077/comments","review_comment_url":"https://api.github.com/repos/snowplow/snowplow/pulls/comments{/number}","comments_url":"https://api.github.com/repos/snowplow/snowplow/issues/3077/comments","statuses_url":"https://api.github.com/repos/snowplow/snowplow/statuses/a223caa5117984d7501cb1be277881b465848778","head":{"label":"snowplow:feature/spark-enrich","ref":"feature/spark-enrich","sha":"a223caa5117984d7501cb1be277881b465848778","user":{"login":"snowplow","id":1476001,"avatar_url":"https://avatars.githubusercontent.com/u/1476001?v=3","gravatar_id":"","url":"https://api.github.com/users/snowplow","html_url":"https://github.com/snowplow","followers_url":"https://api.github.com/users/snowplow/followers","following_url":"https://api.github.com/users/snowplow/following{/other_user}","gists_url":"https://api.github.com/users/snowplow/gists{/gist_id}","starred_url":"https://api.github.com/users/snowplow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snowplow/subscriptions","organizations_url":"https://api.github.com/users/snowplow/orgs","repos_url":"https://api.github.com/users/snowplow/repos","events_url":"https://api.github.com/users/snowplow/events{/privacy}","received_events_url":"https://api.github.com/users/snowplow/received_events","type":"Organization","site_admin":false},"repo":{"id":3591964,"name":"snowplow","full_name":"snowplow/snowplow","owner":{"login":"snowplow","id":1476001,"avatar_url":"https://avatars.githubusercontent.com/u/1476001?v=3","gravatar_id":"","url":"https://api.github.com/users/snowplow","html_url":"https://github.com/snowplow","followers_url":"https://api.github.com/users/snowplow/followers","following_url":"https://api.github.com/users/snowplow/following{/other_user}","gists_url":"https://api.github.com/users/snowplow/gists{/gist_id}","starred_url":"https://api.github.com/users/snowplow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snowplow/subscriptions","organizations_url":"https://api.github.com/users/snowplow/orgs","repos_url":"https://api.github.com/users/snowplow/repos","events_url":"https://api.github.com/users/snowplow/events{/privacy}","received_events_url":"https://api.github.com/users/snowplow/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/snowplow/snowplow","description":"Enterprise-strength web, mobile and event analytics, powered by Hadoop, Kafka, Kinesis, Redshift and Elasticsearch","fork":false,"url":"https://api.github.com/repos/snowplow/snowplow","forks_url":"https://api.github.com/repos/snowplow/snowplow/forks","keys_url":"https://api.github.com/repos/snowplow/snowplow/keys{/key_id}","collaborators_url":"https://api.github.com/repos/snowplow/snowplow/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/snowplow/snowplow/teams","hooks_url":"https://api.github.com/repos/snowplow/snowplow/hooks","issue_events_url":"https://api.github.com/repos/snowplow/snowplow/issues/events{/number}","events_url":"https://api.github.com/repos/snowplow/snowplow/events","assignees_url":"https://api.github.com/repos/snowplow/snowplow/assignees{/user}","branches_url":"https://api.github.com/repos/snowplow/snowplow/branches{/branch}","tags_url":"https://api.github.com/repos/snowplow/snowplow/tags","blobs_url":"https://api.github.com/repos/snowplow/snowplow/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/snowplow/snowplow/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/snowplow/snowplow/git/refs{/sha}","trees_url":"https://api.github.com/repos/snowplow/snowplow/git/trees{/sha}","statuses_url":"https://api.github.com/repos/snowplow/snowplow/statuses/{sha}","languages_url":"https://api.github.com/repos/snowplow/snowplow/languages","stargazers_url":"https://api.github.com/repos/snowplow/snowplow/stargazers","contributors_url":"https://api.github.com/repos/snowplow/snowplow/contributors","subscribers_url":"https://api.github.com/repos/snowplow/snowplow/subscribers","subscription_url":"https://api.github.com/repos/snowplow/snowplow/subscription","commits_url":"https://api.github.com/repos/snowplow/snowplow/commits{/sha}","git_commits_url":"https://api.github.com/repos/snowplow/snowplow/git/commits{/sha}","comments_url":"https://api.github.com/repos/snowplow/snowplow/comments{/number}","issue_comment_url":"https://api.github.com/repos/snowplow/snowplow/issues/comments{/number}","contents_url":"https://api.github.com/repos/snowplow/snowplow/contents/{+path}","compare_url":"https://api.github.com/repos/snowplow/snowplow/compare/{base}...{head}","merges_url":"https://api.github.com/repos/snowplow/snowplow/merges","archive_url":"https://api.github.com/repos/snowplow/snowplow/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/snowplow/snowplow/downloads","issues_url":"https://api.github.com/repos/snowplow/snowplow/issues{/number}","pulls_url":"https://api.github.com/repos/snowplow/snowplow/pulls{/number}","milestones_url":"https://api.github.com/repos/snowplow/snowplow/milestones{/number}","notifications_url":"https://api.github.com/repos/snowplow/snowplow/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/snowplow/snowplow/labels{/name}","releases_url":"https://api.github.com/repos/snowplow/snowplow/releases{/id}","deployments_url":"https://api.github.com/repos/snowplow/snowplow/deployments","created_at":"2012-03-01T13:02:21Z","updated_at":"2017-02-03T03:59:56Z","pushed_at":"2017-02-03T12:53:21Z","git_url":"git://github.com/snowplow/snowplow.git","ssh_url":"git@github.com:snowplow/snowplow.git","clone_url":"https://github.com/snowplow/snowplow.git","svn_url":"https://github.com/snowplow/snowplow","homepage":"http://snowplowanalytics.com","size":19599,"stargazers_count":3133,"watchers_count":3133,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":720,"mirror_url":null,"open_issues_count":820,"forks":720,"open_issues":820,"watchers":3133,"default_branch":"master"}},"base":{"label":"snowplow:master","ref":"master","sha":"278e99ce1ae547844c90fe41f79489d58e99caf1","user":{"login":"snowplow","id":1476001,"avatar_url":"https://avatars.githubusercontent.com/u/1476001?v=3","gravatar_id":"","url":"https://api.github.com/users/snowplow","html_url":"https://github.com/snowplow","followers_url":"https://api.github.com/users/snowplow/followers","following_url":"https://api.github.com/users/snowplow/following{/other_user}","gists_url":"https://api.github.com/users/snowplow/gists{/gist_id}","starred_url":"https://api.github.com/users/snowplow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snowplow/subscriptions","organizations_url":"https://api.github.com/users/snowplow/orgs","repos_url":"https://api.github.com/users/snowplow/repos","events_url":"https://api.github.com/users/snowplow/events{/privacy}","received_events_url":"https://api.github.com/users/snowplow/received_events","type":"Organization","site_admin":false},"repo":{"id":3591964,"name":"snowplow","full_name":"snowplow/snowplow","owner":{"login":"snowplow","id":1476001,"avatar_url":"https://avatars.githubusercontent.com/u/1476001?v=3","gravatar_id":"","url":"https://api.github.com/users/snowplow","html_url":"https://github.com/snowplow","followers_url":"https://api.github.com/users/snowplow/followers","following_url":"https://api.github.com/users/snowplow/following{/other_user}","gists_url":"https://api.github.com/users/snowplow/gists{/gist_id}","starred_url":"https://api.github.com/users/snowplow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snowplow/subscriptions","organizations_url":"https://api.github.com/users/snowplow/orgs","repos_url":"https://api.github.com/users/snowplow/repos","events_url":"https://api.github.com/users/snowplow/events{/privacy}","received_events_url":"https://api.github.com/users/snowplow/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/snowplow/snowplow","description":"Enterprise-strength web, mobile and event analytics, powered by Hadoop, Kafka, Kinesis, Redshift and Elasticsearch","fork":false,"url":"https://api.github.com/repos/snowplow/snowplow","forks_url":"https://api.github.com/repos/snowplow/snowplow/forks","keys_url":"https://api.github.com/repos/snowplow/snowplow/keys{/key_id}","collaborators_url":"https://api.github.com/repos/snowplow/snowplow/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/snowplow/snowplow/teams","hooks_url":"https://api.github.com/repos/snowplow/snowplow/hooks","issue_events_url":"https://api.github.com/repos/snowplow/snowplow/issues/events{/number}","events_url":"https://api.github.com/repos/snowplow/snowplow/events","assignees_url":"https://api.github.com/repos/snowplow/snowplow/assignees{/user}","branches_url":"https://api.github.com/repos/snowplow/snowplow/branches{/branch}","tags_url":"https://api.github.com/repos/snowplow/snowplow/tags","blobs_url":"https://api.github.com/repos/snowplow/snowplow/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/snowplow/snowplow/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/snowplow/snowplow/git/refs{/sha}","trees_url":"https://api.github.com/repos/snowplow/snowplow/git/trees{/sha}","statuses_url":"https://api.github.com/repos/snowplow/snowplow/statuses/{sha}","languages_url":"https://api.github.com/repos/snowplow/snowplow/languages","stargazers_url":"https://api.github.com/repos/snowplow/snowplow/stargazers","contributors_url":"https://api.github.com/repos/snowplow/snowplow/contributors","subscribers_url":"https://api.github.com/repos/snowplow/snowplow/subscribers","subscription_url":"https://api.github.com/repos/snowplow/snowplow/subscription","commits_url":"https://api.github.com/repos/snowplow/snowplow/commits{/sha}","git_commits_url":"https://api.github.com/repos/snowplow/snowplow/git/commits{/sha}","comments_url":"https://api.github.com/repos/snowplow/snowplow/comments{/number}","issue_comment_url":"https://api.github.com/repos/snowplow/snowplow/issues/comments{/number}","contents_url":"https://api.github.com/repos/snowplow/snowplow/contents/{+path}","compare_url":"https://api.github.com/repos/snowplow/snowplow/compare/{base}...{head}","merges_url":"https://api.github.com/repos/snowplow/snowplow/merges","archive_url":"https://api.github.com/repos/snowplow/snowplow/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/snowplow/snowplow/downloads","issues_url":"https://api.github.com/repos/snowplow/snowplow/issues{/number}","pulls_url":"https://api.github.com/repos/snowplow/snowplow/pulls{/number}","milestones_url":"https://api.github.com/repos/snowplow/snowplow/milestones{/number}","notifications_url":"https://api.github.com/repos/snowplow/snowplow/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/snowplow/snowplow/labels{/name}","releases_url":"https://api.github.com/repos/snowplow/snowplow/releases{/id}","deployments_url":"https://api.github.com/repos/snowplow/snowplow/deployments","created_at":"2012-03-01T13:02:21Z","updated_at":"2017-02-03T03:59:56Z","pushed_at":"2017-02-03T12:53:21Z","git_url":"git://github.com/snowplow/snowplow.git","ssh_url":"git@github.com:snowplow/snowplow.git","clone_url":"https://github.com/snowplow/snowplow.git","svn_url":"https://github.com/snowplow/snowplow","homepage":"http://snowplowanalytics.com","size":19599,"stargazers_count":3133,"watchers_count":3133,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":720,"mirror_url":null,"open_issues_count":820,"forks":720,"open_issues":820,"watchers":3133,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/snowplow/snowplow/pulls/3077"},"html":{"href":"https://github.com/snowplow/snowplow/pull/3077"},"issue":{"href":"https://api.github.com/repos/snowplow/snowplow/issues/3077"},"comments":{"href":"https://api.github.com/repos/snowplow/snowplow/issues/3077/comments"},"review_comments":{"href":"https://api.github.com/repos/snowplow/snowplow/pulls/3077/comments"},"review_comment":{"href":"https://api.github.com/repos/snowplow/snowplow/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/snowplow/snowplow/pulls/3077/commits"},"statuses":{"href":"https://api.github.com/repos/snowplow/snowplow/statuses/a223caa5117984d7501cb1be277881b465848778"}}}}
{"actor":{"display_login":"BenFradet"}}