簡體   English   中英

python Spark avro

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM