Tengo un json archivo, nodes que se parece a esto:

[{"toid":"osgb4000000031043205","point":[508180.748,195333.973],"index":1}
,{"toid":"osgb4000000031043206","point":[508163.122,195316.627],"index":2}
,{"toid":"osgb4000000031043207","point":[508172.075,195325.719],"index":3}
,{"toid":"osgb4000000031043208","point":[508513,196023],"index":4}]

Soy capaz de leer y manipular este registro con Python.

Estoy tratando de leer este archivo en scala a través de la spark-shell.

De este tutorial, puedo ver que es posible leer json a través de sqlContext.read.json

val vfile = sqlContext.read.json("path/to/file/nodes.json")

Sin embargo, esto resulta en un corrupt_record de error:

vfile: org.apache.spark.sql.DataFrame = [_corrupt_record: string]

¿Alguien puede arrojar algo de luz sobre este error? Puedo leer y utilizar el archivo con otras aplicaciones y estoy seguro de que no es corrupto y sonido json.

OriginalEl autor LearningSlowly | 2016-08-11

4 Comentarios

  1. 15

    Chispa no puede leer JSON array a un registro en el nivel superior, por lo que tiene que pasar:

    {"toid":"osgb4000000031043205","point":[508180.748,195333.973],"index":1} 
    {"toid":"osgb4000000031043206","point":[508163.122,195316.627],"index":2} 
    {"toid":"osgb4000000031043207","point":[508172.075,195325.719],"index":3} 
    {"toid":"osgb4000000031043208","point":[508513,196023],"index":4}

    Como se describe en el tutorial que se está refiriendo a:

    Vamos a empezar por la carga de un archivo JSON, donde cada línea es un objeto JSON

    El razonamiento es muy simple. La chispa de espera para pasar un archivo con una gran cantidad de JSON-entidades, por lo que se podría distribuir su procesamiento (por entidad, aproximadamente diciendo). Así que por eso se espera que para analizar una entidad de nivel superior, pero obtiene una matriz, que es imposible asignar a un registro ya que no hay nombre para dicha columna. Básicamente, (pero no exactamente) Spark es ver tu matriz de una fila con una columna y no puede encontrar un nombre para la columna.

    A poner más luz sobre ella, aquí es un formulario de cotización el oficial doc

    Tenga en cuenta que el archivo que se ofrece como un archivo json no es un típico
    Archivo JSON. Cada línea debe contener un independiente, autónomo válido
    Objeto JSON. Como consecuencia, regular multi-línea de archivo JSON se
    la mayoría fallan a menudo.

    Este formato es a menudo llamado JSONL. Básicamente se trata de una alternativa a CSV.

    Gracias @dl14. Voy a tener que pensar acerca de cómo preparar los archivos de entrada en más profundidad
    Visitantes: asegúrese de leer la última parte de esta respuesta: «tenga en cuenta que el archivo que se ofrece como un archivo json no es un típico archivo JSON. Cada línea debe contener un independiente, autónomo válido objeto JSON. Como consecuencia, regular multi-línea de archivo JSON mayoría de las veces fracasan.»

    OriginalEl autor dk14

  2. 8

    A leer el multi-línea de JSON como un DataFrame:

    val spark = SparkSession.builder().getOrCreate()
    
    val df = spark.read.json(spark.sparkContext.wholeTextFiles("file.json").values)

    La lectura de archivos de gran tamaño, de esta manera no es recomendable, desde el wholeTextFiles docs

    Pequeños archivos que son los preferidos, archivo de gran tamaño, también es permitido, pero puede causar mal funcionamiento.

    Impresionante… Gracias Datageek. Tu post me ayudo..

    OriginalEl autor Datageek

  3. 0

    Me encuentro con el mismo problema. He utilizado sparkContext y sparkSql en la misma configuración:

    val conf = new SparkConf()
      .setMaster("local[1]")
      .setAppName("Simple Application")
    
    
    val sc = new SparkContext(conf)
    
    val spark = SparkSession
      .builder()
      .config(conf)
      .getOrCreate()

    A continuación, utilizando la chispa contexto he leído todo el json JSON (- ruta de acceso al archivo) archivo:

     val jsonRDD = sc.wholeTextFiles(JSON).map(x => x._2)

    Puede crear un esquema para el futuro selecciona, filtros…

    val schema = StructType( List(
      StructField("toid", StringType, nullable = true),
      StructField("point", ArrayType(DoubleType), nullable = true),
      StructField("index", DoubleType, nullable = true)
    ))

    Crear un DataFrame el uso de chispa sql:

    var df: DataFrame = spark.read.schema(schema).json(jsonRDD).toDF()

    Para las pruebas de uso mostrar y printSchema:

    df.show()
    df.printSchema()

    sbt construir archivo:

    name := "spark-single"
    
    version := "1.0"
    
    scalaVersion := "2.11.7"
    
    libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.2"
    libraryDependencies +="org.apache.spark" %% "spark-sql" % "2.0.2"

    OriginalEl autor Robert Gabriel

  4. 0

    Como Chispa espera «JSON formato de la Línea de» no es un típico formato JSON, podemos decir chispa para leer típico JSON especificando:

    val df = spark.read.option("multiline", "true").json("<file>")

    OriginalEl autor SandeepGodara

Dejar respuesta

Please enter your comment!
Please enter your name here