scala - 读取多个 AVRO 文件时出现对象不可序列化错误
问题描述
我正在尝试将 HDFS 目录中的小 avro 文件合并到一个文件中。有人可以指导我如何使用 scala-spark 合并它们。提前致谢。
下面显示的代码使用 newAPIHadoopFile 方法创建一个 RDD。
val src = "/hdfs/path/to/folder"
val rdd = sc.newAPIHadoopFile(src, classOf[AvroKeyInputFormat[GenericRecord]], classOf[AvroKey[GenericRecord]], classOf[NullWritable], sc.hadoopConfiguration)
它给了我以下错误,告诉我我做错了什么:
scala> rdd.take(1).foreach(println)
19/07/16 07:28:59 WARN AvroKeyInputFormat: Reader schema was not set. Use AvroJob.setInputKeySchema() if desired.
19/07/16 07:28:59 ERROR Executor: Exception in task 0.0 in stage 2.0 (TID 2)
java.io.NotSerializableException: org.apache.avro.mapred.AvroKey
Serialization stack:
- object not serializable (class: org.apache.avro.mapred.AvroKey, value: {someValue})
- field (class: scala.Tuple2, name: _1, type: class java.lang.Object)
- object (class scala.Tuple2, (someValue,(null)))
- element of array (index: 0)
- array (class [Lscala.Tuple2;, size 1)
解决方案
如果您不关心 rdd 更简单的方法是使用 Spark Dataframe。对于 Spark 2+ 代码看起来像这样
val spark = SparkSession.builder().getOrCreate()
val inputAvro = spark.read.format("com.databricks.spark.avro").load("/hdfs/path/to/folder")
inputAvro.coalesce(partitionNumber).write.format("com.databricks.spark.avro").save("<outputPath>")
这partitionNumber
将是您想要将 avro 写入的文件数量
运行此代码时,您必须包含--packages com.databricks:spark-avro_2.11:4.0.0
以确保它能够读取 avro 阅读器
推荐阅读
- javascript - 单击 chrome 扩展图标时在新窗口中打开当前页面 URL
- postgresql - Postgres Include 抛出“名称”:“SequelizeEagerLoadingError”
- ios - 在 swift 中使用 tablview 设计应用程序的 UI
- php - Symfony:三个表格内的教义映射并在复选框循环中显示数据
- php - 下拉列表不显示来自已连接数据库的数据
- c - 我的代码有什么问题?解析输入文本文件 (C)
- r - 将数据写入excel,标题在标题上方 - R
- pyomo - TypeError:“_SumExpression”对象不可迭代
- android - 使用 GPS 获取纬度和经度为 0,0
- javascript - 在c#中使用javascript调用按钮单击函数