Leer Json en Scala

Leer Json de cadena de texto

Ejemplo simple de lectura de Json a partir de una cadena de texto

val events = sc.parallelize(
"""
[{"accion":"create","tiempo":"2018-08-07T00:01:17Z"},
 {"accion":"create","tiempo":"2018-08-07T00:01:17Z"}]
""" :: Nil)

val df = sqlContext.read.json(events)
df.printSchema()
df.show()
root
|-- accion: string (nullable = true)
|-- tiempo: string (nullable = true)

+------+--------------------+
|accion|              tiempo|
+------+--------------------+
|create|2018-08-07T00:01:17Z|
|create|2018-08-07T00:01:17Z|
+------+--------------------+

Leer Json de cadena de texto autodefiniendo la estructura

Ejemplo simple de lectura de Json a partir de una cadena de texto autodefiniendo la estructura

val events = sc.parallelize(
"""
[{"accion":"create","tiempo":"2018-08-07T00:01:17Z"},
{"accion":"create","tiempo":"2018-08-07T00:01:17Z"}]
""" :: Nil)

import org.apache.spark.sql.types.{DataType, StructType}

// Leer el esquema del Json
val schema_json=spark.read.json(events).schema.json

// Añadir el esquema
val schema=DataType.fromJson(schema_json).asInstanceOf[StructType]

// Leer el Json usando el esquema
val df=spark.read.schema(schema).json(events)

df.printSchema()
df.show()

 

Leer Json de cadena de texto definiendo la estructura

Ejemplo simple de lectura de Json a partir de una cadena de texto definiendo la estructura

import org.apache.spark.sql.types._

val events = sc.parallelize(
"""
[{"accion":"create","evento":{"tipo":1,"tiempo":"2018-08-07T00:01:17Z"}},
 {"accion":"create","evento":{"tipo":1,"tiempo":"2018-08-07T00:01:17Z"}}]
"""
:: Nil)

val schema = (new StructType)
  .add("accion", StringType)
  .add("evento", (new StructType)
      .add("tipo", LongType)
      .add("tiempo", StringType)
   )
  
// Leer el Json usando el esquema 
val df=spark.read.schema(schema).json(events)

df.printSchema()
df.show()
df.select($"evento.*").show()
root
 |-- accion: string (nullable = true)
 |-- evento: struct (nullable = true)
 |    |-- tipo: long (nullable = true)
 |    |-- tiempo: string (nullable = true)

+------+--------------------+
|accion|              evento|
+------+--------------------+
|create|[1, 2018-08-07T00...|
|create|[1, 2018-08-07T00...|
+------+--------------------+

+----+--------------------+
|tipo|              tiempo|
+----+--------------------+
|   1|2018-08-07T00:01:17Z|
|   1|2018-08-07T00:01:17Z|
+----+--------------------+

 

Leer Json de HDFS

El fichero prueba1.json contiene exactamente el texto contenido entre tiples comillas en el anterior ejemplo, es decir:

prueba1.json

[{"accion":"create","evento":{"tipo":1,"tiempo":"2018-08-07T00:01:17Z"}},
 {"accion":"create","evento":{"tipo":1,"tiempo":"2018-08-07T00:01:17Z"}}]

Una vez definido el contenido se especifica como leer este fichero HDFS:

val df = spark.read.json(spark.sparkContext.wholeTextFiles("/pruebas/prueba1.json").values)
df.printSchema()
df.select($"evento.*").show()
root
 |-- accion: string (nullable = true)
 |-- evento: struct (nullable = true)
 |    |-- tipo: long (nullable = true)
 |    |-- tiempo: string (nullable = true)

+----+--------------------+
|tipo|              tiempo|
+----+--------------------+
|   1|2018-08-07T00:01:17Z|
|   1|2018-08-07T00:01:17Z|
+----+--------------------+