[英]python Spark avro
在嘗試編寫avro時,我收到以下錯誤:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 7 in stage 35.0 failed 1 times, most recent failure: Lost task 7.0 in stage 35.0 (TID 110, localhost): java.lang.ClassCastException: java.util.HashMap cannot be cast to org.apache.avro.mapred.AvroWrapper
我使用以下3條記錄讀取了avro文件:
avro_rdd = sc.newAPIHadoopFile(
"threerecords.avro",
"org.apache.avro.mapreduce.AvroKeyInputFormat",
"org.apache.avro.mapred.AvroKey",
"org.apache.hadoop.io.NullWritable",
keyConverter="org.apache.spark.examples.pythonconverters.AvroWrapperToJavaConverter",
conf=None)
output = avro_rdd.map(lambda x: x[0]).collect()
然后我嘗試寫出一條記錄(avro中保存的輸出):
conf = {"avro.schema.input.key": reduce(lambda x, y: x + y, sc.textFile("myschema.avsc", 1).collect())}
sc.parallelize([output[0]]).map(lambda x: (x, None)).saveAsNewAPIHadoopFile(
"output.avro",
"org.apache.avro.mapreduce.AvroKeyOutputFormat",
"org.apache.avro.mapred.AvroKey",
"org.apache.hadoop.io.NullWritable",
keyConverter="org.apache.spark.examples.pythonconverters.AvroWrapperToJavaConverter",
conf=conf)
如何解決這個錯誤/寫出一個單獨的avro記錄? 我知道我的架構是正確的,因為它來自avro本身。
目前看來這似乎不受支持。 您現在嘗試將Java地圖用作Avro記錄並再次將其轉換為Java地圖。 這就是為什么你得到關於java hashmap錯誤的錯誤。
有一個來自staslos的pull請求來添加Avro輸出格式,請參閱pull請求的鏈接和示例。
AvroConverters.scala中缺少一個轉換器,可以將Java映射轉換回avro格式。
我上周遇到了完全相同的問題。 基於rfkortekass的回答,我使用了來自staslos的pull請求,並嘗試在avro文件中設置一個簡單的讀/寫示例。
我設法讓一個簡單的演示工作。 你可以在這里找到這些文件https://github.com/totor31/spark-avro-python-converters
我對scala,java和maven都一無所知,所以這是非常實驗性的:我的主要目標是從spark examples目錄中提取非常有限的文件,以獲得允許生成可用jar文件的編譯框架。
如果有更多知識淵博的人想要與我的存儲庫進行交互,請隨時提問。
非常感謝rfkortekass指出拉取請求,它為我節省了很多時間。
幾個月后回來:
在新版本中使用spark DataFrames是編寫avro文件的好方法:請參閱https://github.com/databricks/spark-avro
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.