web-dev-qa-db-fra.com

Comment lire le fichier Avro dans PySpark

J'écris un travail d'étincelle en utilisant python. Cependant, j'ai besoin de lire un tas de fichiers AVRO. 

This est la solution la plus proche que j'ai trouvée dans le dossier exemple de Spark. Cependant, vous devez soumettre ce script python à l'aide de spark-submit. Dans la ligne de commande de spark-submit, vous pouvez spécifier la classe de pilote. Dans ce cas, toutes vos classes avrokey, avrovalue seront localisées. 

avro_rdd = sc.newAPIHadoopFile(
        path,
        "org.Apache.avro.mapreduce.AvroKeyInputFormat",
        "org.Apache.avro.mapred.AvroKey",
        "org.Apache.hadoop.io.NullWritable",
        keyConverter="org.Apache.spark.examples.pythonconverters.AvroWrapperToJavaConverter",
        conf=conf)

Dans mon cas, je dois tout exécuter dans le script Python. J'ai essayé de créer une variable d'environnement pour inclure le fichier jar. Python croisé ajoutera le fichier jar au chemin, mais ce n'est clairement pas le cas, cela me donne une classe inattendue. Erreur. 

os.environ['SPARK_SUBMIT_CLASSPATH'] = "/opt/cloudera/parcels/CDH-5.1.0-1.cdh5.1.0.p0.53/lib/spark/examples/lib/spark-examples_2.10-1.0.0-cdh5.1.0.jar"

Quelqu'un peut-il m'aider à lire un fichier AVRO dans un script Python? 

9
B.Mr.W.

L'ancienne solution nécessite l'installation d'une dépendance Java tierce, ce qui ne plaît pas à la plupart des développeurs Python. Mais vous n'avez pas vraiment besoin d'une bibliothèque externe si tout ce que vous voulez faire est d'analyser vos fichiers Avro avec un schéma donné. Vous pouvez simplement lire les fichiers binaires et les analyser avec votre paquetage Avro python préféré.

Voici comment charger des fichiers Avro à l’aide de fastavro:

from io import BytesIO
import fastavro

schema = {
    ...
}

rdd = sc.binaryFiles("/path/to/dataset/*.avro")\
    .flatMap(lambda args: fastavro.reader(BytesIO(args[1]), reader_schema=schema))

print(rdd.collect())
5
Régis B.

Spark> = 2.4.0

Vous pouvez utiliser le support Avro intégré . L’API est rétro-compatible avec le package spark-avro, avec quelques ajouts (notamment la fonction from_avro/to_avro).

Veuillez noter que le module n'est pas fourni avec les fichiers binaires Spark standard et doit être inclus à l'aide de spark.jars.packages ou d'un mécanisme équivalent.

Spark <2.4.0

Vous pouvez utiliser spark-avro library. Commençons par créer un exemple de jeu de données:

import avro.schema
from avro.datafile import DataFileReader, DataFileWriter

schema_string ='''{"namespace": "example.avro",
 "type": "record",
 "name": "KeyValue",
 "fields": [
     {"name": "key", "type": "string"},
     {"name": "value",  "type": ["int", "null"]}
 ]
}'''

schema = avro.schema.parse(schema_string)

with open("kv.avro", "w") as f, DataFileWriter(f, DatumWriter(), schema) as wrt:
    wrt.append({"key": "foo", "value": -1})
    wrt.append({"key": "bar", "value": 1})

Le lire en utilisant spark-csv est aussi simple que cela:

df = sqlContext.read.format("com.databricks.spark.avro").load("kv.avro")
df.show()

## +---+-----+
## |key|value|
## +---+-----+
## |foo|   -1|
## |bar|    1|
## +---+-----+ 
4
zero323