Soy nuevo en el Spark. Tengo un dataframe que contiene los resultados de algunos análisis. Me convertí que dataframe en JSON para que yo pudiera mostrar en un Matraz de Aplicación:

results = result.toJSON().collect()

Un ejemplo de una entrada en mi archivo json está por debajo. Luego traté de ejecutar un bucle for con el fin de obtener resultados específicos:

{"userId":"1","systemId":"30","title":"interest"}

for i in results:
    print i["userId"]

Esto no funciona en absoluto y me da errores como: Python (json) : TypeError: cadena esperada de búfer o

He utilizado json.dumps y json.loads y todavía nada – sigo recibiendo errores tales como la cadena de índices deben ser números enteros, así como el error anterior.

Luego traté de esto:

  print i[0]

Esto me dio el primer carácter en el json » { » , en lugar de la primera línea. Realmente no sé qué hacer, ¿alguien puede decirme a donde voy mal?

Muchas Gracias.

InformationsquelleAutor xn139 | 2017-04-05

3 Comentarios

  1. 7

    Si el resultado de result.toJSON().collect() es un string codificado en JSON, entonces se puede utilizar json.loads() para convertirlo en un dict. El problema está ejecutando en es que cuando se itera un dict con un for bucle, te dan las llaves de la dict. En su for bucle, eres el tratamiento de la clave, ya que si es un dict, cuando en realidad es sólo un string. Intente esto:

    # toJSON() turns each row of the DataFrame into a JSON string
    # calling first() on the result will fetch the first row.
    results = json.loads(result.toJSON().first())
    
    for key in results:
        print results[key]
    
    # To decode the entire DataFrame iterate over the result
    # of toJSON()
    
    def print_rows(row):
        data = json.loads(row)
        for key in data:
            print "{key}:{value}".format(key=key, value=data[key])
    
    
    results = result.toJSON()
    results.foreach(print_rows)    

    EDICIÓN: El problema es que recopilar devuelve un list, no dict. He actualizado el código. Siempre lea la documentación.

    collect() devuelve una lista que contiene todos los elementos de esta RDD.

    Nota: Este método sólo debe utilizarse si la matriz resultante es
    espera a ser pequeñas, ya que todos los datos se han cargado en el controlador de la
    memoria.

    EDIT2: yo no puedo enfatizar lo suficiente, siempre leer la documentación.

    EDIT3: Mirada aquí.

    • Hola @Allie, me sale este error: TypeError: cadena esperada de búfer o al ejecutar – ¿hay alguna razón ¿por qué?
    • Lo más probable es que debido a collect devuelve un dict y no un string codificado en JSON. Pruebe a quitar json.loads
    • Todavía no funciona, ahora estoy recibiendo un str índices de error?
    • Actualizada la respuesta. Ahora debería funcionar.
    • Hola Allie, estoy consiguiendo: obj, end = self.raw_decode(s, idx=_w(s, 0).end() TypeError: espera búfer o cadena de ahora
    • Hizo un poco más de investigación en toJSON y actualizada de la respuesta.
    • Hola Allie, lo siento volver otra vez! Todavía no trabajo, estoy recibiendo ahora esto: TypeError: ‘RDD’ el objeto no es iterable?
    • RDDs tienen un forEach función para recorrer.
    • ¿usted recibe «TypeError: cadena esperada o buffer» probablemente sólo cuando se utiliza foreachPartition lugar foreach
    • Los tipos devueltos no son la misma >>> df.toJSON().foreach(x) <tipo ‘unicode’> <tipo ‘unicode’> <tipo ‘unicode’> >>> df.toJSON().foreachPartition(x) <tipo ‘generador’> <tipo ‘generador’> <tipo ‘generador’> <tipo ‘generador’>

  2. 3
    import json
    >>> df = sqlContext.read.table("n1")
    >>> df.show()
    +-----+-------+----+---------------+-------+----+
    |   c1|     c2|  c3|             c4|     c5|  c6|
    +-----+-------+----+---------------+-------+----+
    |00001|Content|   1|Content-article|       |2018|
    |00002|Content|null|Content-article|Content|2015|
    +-----+-------+----+---------------+-------+----+
    
    >>> results = df.toJSON().map(lambda j: json.loads(j)).collect()
    >>> for i in results: print i["c1"], i["c6"]
    ... 
    00001 2018
    00002 2015
  3. 2

    Aquí es lo que funcionó para mí:

    df_json = df.toJSON()
    
    for row in df_json.collect():
        #json string
        print(row) 
    
        #json object
        line = json.loads(row) 
        print(line[some_key]) 

    Tenga en cuenta que el uso de .collect() no es aconsejable, ya que recoge los datos distribuidos marcos, y derrota el propósito de la utilización de los marcos de datos.

    • Así que, ¿por qué publicar esta respuesta? Por favor, mueva el tener en mente a la parte superior de su respuesta.

Dejar respuesta

Please enter your comment!
Please enter your name here