in spark/sql-30/src/main/scala/org/elasticsearch/spark/sql/DefaultSource.scala [568:608]
private def extract(value: Any, inJsonFormat: Boolean, asJsonArray: Boolean):String = {
// common-case implies primitives and String so try these before using the full-blown ValueWriter
value match {
case null => "null"
case u: Unit => "null"
case b: Boolean => b.toString
case by: Byte => by.toString
case s: Short => s.toString
case i: Int => i.toString
case l: Long => l.toString
case f: Float => f.toString
case d: Double => d.toString
case bd: BigDecimal => bd.toString
case _: Char |
_: String |
_: Array[Byte] => if (inJsonFormat) StringUtils.toJsonString(value.toString) else value.toString()
// handle Timestamp also
case dt: Date => {
val cal = Calendar.getInstance()
cal.setTime(dt)
val str = DatatypeConverter.printDateTime(cal)
if (inJsonFormat) StringUtils.toJsonString(str) else str
}
case ar: Array[Any] =>
if (asJsonArray) (for (i <- ar) yield extract(i, true, false)).distinct.mkString("[", ",", "]")
else (for (i <- ar) yield extract(i, false, false)).distinct.mkString("\"", " ", "\"")
// new in Spark 1.4
case utf if (isClass(utf, "org.apache.spark.sql.types.UTF8String")
// new in Spark 1.5
|| isClass(utf, "org.apache.spark.unsafe.types.UTF8String"))
=> if (inJsonFormat) StringUtils.toJsonString(utf.toString()) else utf.toString()
case a: AnyRef => {
val storage = new FastByteArrayOutputStream()
val generator = new JacksonJsonGenerator(storage)
valueWriter.write(a, generator)
generator.flush()
generator.close()
storage.toString()
}
}
}