2015-04-20 9 views
7

yılında Avro dosyasını okumak için. Ancak, bir sürü avro dosyasında okumalıyım.nasıl Python kullanılarak bir kıvılcım işi yazıyorum PySpark

This Ben Spark'ın örnek klasöründe bulduk yakın çözümdür. Ancak, bu python komut dosyasını kıvılcım göndererek göndermeniz gerekir. Kıvılcım gönderme komut satırında, sürücü sınıfını belirtebilirsiniz, bu durumda, tüm avrokey, avrovalue sınıfı bulunacaktır. Benim durumumda

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) 

, ben Python komut içindeki her şeyi çalıştırmak için gereken, ben kavanoz dosya eklemek için bir ortam değişken oluşturmak için çalıştık, parmak arası Python yoluna kavanoz katacak ama açıkça değil , bana beklenmedik bir sınıf hatası veriyor.

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" 

Herkes bir python komut dosyasında avro dosyasını okuma konusunda bana yardımcı olabilir mi?

cevap

3

Sen spark-avro kitaplığını kullanabilirsiniz. spark-csv kullanarak Okuma

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}) 

bu kadar basittir: Önce bir örnek veri kümesini oluşturmanızı sağlar

eski çözüm çoğu Python şey değil bir üçüncü taraf Java bağımlılık, yüklemeye gerektirir
df = sqlContext.read.format("com.databricks.spark.avro").load("kv.avro") 
df.show() 

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

devler ile mutluyuz. Fakat yapmak istediğiniz tek şey, Avro dosyalarınızı belirli bir şema ile ayrıştırmaksa, gerçekten bir dış kütüphaneye ihtiyacınız yoktur. İkili dosyaları okuyabilir ve en sevdiğiniz python Avro paketi ile bunları ayrıştırabilirsiniz. Örneğin

, bu fastavro kullanarak Avro dosyaları yükleyebilirsiniz nasıl:

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()) 
İlgili konular