Skip to content

Instantly share code, notes, and snippets.

@petrovg
petrovg / more_on_options.md
Last active May 24, 2017 19:48
Scala Option of Try / Options in function signatures

More on Scala Options

I came across this function today:

def validateTaskIdOpt(idOpt: Option[TaskId], dao: DAO): Try[Unit] = {
  val opt: Option[Try[Job]] = idOpt.map { id => CommonValidations.validateJobWithTaskId(id, dao) }

opt match {

@petrovg
petrovg / SparkStatsLogger.scala
Last active September 17, 2019 11:30
Logging listener for Spark
import java.io.PrintWriter
import java.util.Properties
import org.apache.spark.SparkContext
import org.apache.spark.scheduler._
import org.apache.spark.storage.RDDInfo
/**
* Created by petrovg on 22/04/2017.
*/
@petrovg
petrovg / gist:5e15279d13d60c103931dc6c47203e92
Created September 23, 2016 09:11
Some Scala Option examples...
object TMP extends App {
// A few things I wish were more obvious about Scala's Options
case class CarMake(name: String)
case class CarModel(name: String)
case class Car(make: CarMake, model: Option[CarModel])
case class StreetName(value: String)
val streets = for { a <- angiesStreet; b <- jacksStreet } yield (angiesStreet + " --- " + jacksStreet) // <--- None, becuase Jack's got no address
println(streets)
val angiesStreet = angie.address.map(_.street) // == StreetName("Three Elms Street")
println(jacksStreet)
println(angiesStreet)
// Many other collection functions produce predictable results:
println(angie.car.size)
println(angie.car.isEmpty)
val jack = Person("Jack", address = None, car = None)
val mary = Person("Mary", Some(Address("6A", StreetName("Mill Street"))), Some(Car(CarMake("VW"), Some(CarModel("Transporter")))))
val angie = Person("Angie", address = Some(Address("22", StreetName("Three Elms Street"))), Some(Car(CarMake("VW"), Some(CarModel("Transporter")))))
val laure = Person("Laure", address = None, car = Some(Car(CarMake("Peugeout"), None)))
val people = List(jack, mary, angie, laure)
jack.address.foreach(println) // <--- prints nothing
mary.address.foreach(println) // <--- prints >> Address(6A,StreetName(Mill Street)) <<
case class CarMake(name: String)
case class CarModel(name: String)
case class Car(make: CarMake, model: Option[CarModel])
case class StreetName(value: String)
case class Address(number: String, street: StreetName)
case class Person(name: String, address: Option[Address], car: Option[Car])
@petrovg
petrovg / gist:d5e705e710efeb822141
Created August 12, 2015 15:50
How to broadcast your JSON ObjectMapper across a Spark cluster, so that it's only instantiated once on each node. The ObjectMapper is supposed to be reused, but this is not trivial in Spark. Fortunately, Scala's lazy values make this super easy...
class MapperHolder extends Serializable {
lazy val mapper = {
val m = new ObjectMapper with ScalaObjectMapper
m.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
m.registerModule(DefaultScalaModule)
m
}
}
val holderBcast = sc.broadcast(new MapperHolder())
@petrovg
petrovg / MagnetExample.scala
Last active May 1, 2017 20:25
Trying to understand the Magnet pattern (as used in spray)
// Trying to understand the Magnet pattern (as used in spray)
// http://spray.io/blog/2012-12-13-the-magnet-pattern/
/**
* A simple utility that writes things to strings.
* We'd like it to be able to work for multiple different types
*/
object Writer {
/**
* We want this to work for multiple types that we don't know yet,
@petrovg
petrovg / gist:7e13a7d2e07564dfdacb
Created March 18, 2015 16:41
Scala - Getting future result optionally and combining it with previous future result.
//
// Is there a better way to do this. The difficulty is coming from the fact that the
// second future result may not be necessary, based on an optinal value in the first.
//
import scala.concurrent.{Await, Future}
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
case class User(name: String, homepageUrl: Option[String])
case class UserProfile(userName: String, profile: String)