tutorial spark read examples example scala apache-spark apache-spark-sql

scala - read - spark sql example



¿Cómo acceder a las subentidades en el archivo JSON? (1)

columnas de entrada dadas: [_corrupt_record] ;;

El motivo es que Spark admite archivos JSON en los que "cada línea debe contener un objeto JSON válido e independiente".

Citando conjuntos de datos JSON :

Tenga en cuenta que el archivo que se ofrece como un archivo json no es un archivo JSON típico. Cada línea debe contener un objeto JSON válido e independiente. Para obtener más información, consulte el formato de texto JSON Lines, también llamado JSON delimitado por línea nueva. Como consecuencia, un archivo JSON multilínea regular generalmente fallará.

En caso de que un archivo JSON sea incorrecto para Spark, lo almacenará en _corrupt_record (que puede cambiar utilizando la opción columnNameOfCorruptRecord ).

scala> spark.read.json("employee.json").printSchema root |-- _corrupt_record: string (nullable = true)

Y su archivo es incorrecto no solo porque es un JSON multilínea, sino también porque lo dice jq (un procesador JSON liviano y flexible de línea de comandos).

$ cat incorrect.json { "employeeDetails":{ "name": "xxxx", "num:"415" } "work":[ { "monthYear":"01/2007" "workdate":"1|2|3|....|31", "workhours":"8|8|8....|8" }, { "monthYear":"02/2007" "workdate":"1|2|3|....|31", "workhours":"8|8|8....|8" } ], } $ cat incorrect.json | jq parse error: Expected separator between values at line 4, column 14

Una vez que arregle el archivo JSON, use el siguiente truco para cargar el archivo JSON multilínea.

scala> spark.version res5: String = 2.1.1 val employees = spark.read.json(sc.wholeTextFiles("employee.json").values) scala> employees.printSchema root |-- employeeDetails: struct (nullable = true) | |-- name: string (nullable = true) | |-- num: string (nullable = true) |-- work: array (nullable = true) | |-- element: struct (containsNull = true) | | |-- monthYear: string (nullable = true) | | |-- workdate: string (nullable = true) | | |-- workhours: string (nullable = true) scala> employees.select("employeeDetails").show() +---------------+ |employeeDetails| +---------------+ | [xxxx,415]| +---------------+

Spark> = 2.2

A partir de Spark 2.2 ( lanzado recientemente y altamente recomendado para su uso), debe usar la opción multiLine lugar. multiLine opción multiLine en SPARK-20980 Cambie el nombre de la opción wholeFile a multiLine para JSON y CSV .

scala> spark.version res0: String = 2.2.0 scala> spark.read.option("multiLine", true).json("employee.json").printSchema root |-- employeeDetails: struct (nullable = true) | |-- name: string (nullable = true) | |-- num: string (nullable = true) |-- work: array (nullable = true) | |-- element: struct (containsNull = true) | | |-- monthYear: string (nullable = true) | | |-- workdate: string (nullable = true) | | |-- workhours: string (nullable = true)

Tengo un archivo json como este:

{ "employeeDetails":{ "name": "xxxx", "num":"415" }, "work":[ { "monthYear":"01/2007", "workdate":"1|2|3|....|31", "workhours":"8|8|8....|8" }, { "monthYear":"02/2007", "workdate":"1|2|3|....|31", "workhours":"8|8|8....|8" } ] }

Tengo que obtener la fecha de trabajo, las horas de trabajo de esta información JSON.

Intenté así:

import org.apache.spark.{SparkConf, SparkContext} object JSON2 { def main (args: Array[String]) { val spark = SparkSession.builder() .appName("SQL-JSON") .master("local[4]") .getOrCreate() import spark.implicits._ val employees = spark.read.json("sample.json") employees.printSchema() employees.select("employeeDetails").show() } }

Estoy recibiendo una excepción como esta:

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve ''`employeeDetails`'' given input columns: [_corrupt_record];; ''Project [''employeeDetails] +- Relation[_corrupt_record#0] json

Soy nuevo en Spark.