2015-04-20 11 views
7

में एवरो फ़ाइल को कैसे पढ़ा जाए, मैं अजगर का उपयोग कर स्पार्क नौकरी लिख रहा हूं। हालांकि, मुझे एवरो फाइलों के पूरे समूह में पढ़ने की जरूरत है।PySpark

This स्पार्क के उदाहरण फ़ोल्डर में मैंने पाया सबसे नज़दीकी समाधान है। हालांकि, आपको स्पार्क-सबमिट का उपयोग करके इस पायथन स्क्रिप्ट को सबमिट करने की आवश्यकता है। स्पार्क-सबमिट की कमांड लाइन में, आप ड्राइवर-श्रेणी निर्दिष्ट कर सकते हैं, उस स्थिति में, आपके सभी avrokey, avrovalue क्लास स्थित होगा।

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) 

मेरे मामले में, मैं अजगर स्क्रिप्ट के भीतर सब कुछ चलाने के लिए की जरूरत है, मैं जार फ़ाइल शामिल करने के लिए एक वातावरण चर बनाने की कोशिश की है, उंगली पार अजगर रास्ते पर जार जोड़ देगा लेकिन स्पष्ट रूप से यह नहीं है , यह मुझे अप्रत्याशित वर्ग त्रुटि दे रहा है।

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" 

क्या कोई मेरी मदद कर सकता है कि एक पायथन लिपि में एवरो फ़ाइल कैसे पढ़ा जाए?

उत्तर

3

आप spark-avro लाइब्रेरी का उपयोग कर सकते हैं।

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

spark-csv का उपयोग कर इसे पढ़ना इस के रूप में सरल है:: सबसे पहले एक उदाहरण डाटासेट बनाने की सुविधा देता

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

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

पूर्व समाधान एक तीसरे पक्ष के जावा निर्भरता, जो कुछ नहीं है सबसे अजगर स्थापित करने के लिए की आवश्यकता है देव खुश हैं। लेकिन आपको वास्तव में बाहरी लाइब्रेरी की आवश्यकता नहीं है यदि आप जो कुछ करना चाहते हैं वह किसी दिए गए स्कीमा के साथ आपकी एवरो फाइलों को पार्स करें। आप बस बाइनरी फाइलें पढ़ सकते हैं और उन्हें अपने पसंदीदा पायथन एवरो पैकेज के साथ पार्स कर सकते हैं।

उदाहरण के लिए, यह कैसे आप 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())