【发布时间】:2018-03-10 11:30:00
【问题描述】:
我有一个对象,我想为这些列表中的每一个创建一个镶木地板文件。 该对象如下所示:
case class ProgramsData(programs: List[Program], switches: List[Switch], paths: List[Path],
activities: List[Activity], enactments: List[Enactment])
经过一番研究,我对如何实现这一点感到有些困惑。
似乎没有 Apache Spark 的唯一方法是将您的对象转换为 Avro 文件,然后将其读入并获取架构,然后您可以从中创建 parquet 文件。
有没有办法去掉中间人并将我的对象转换为对象内每个列表的镶木地板文件? 如果没有,实现我的最终目标的最简单方法是什么? 遗憾的是,我看到的少数几个例子中的大多数要么不起作用,要么没有完全按照我的意愿行事。
提前致谢。
编辑 因此,经过一整天的工作后,我生成了一些生成文件的代码。但是在编写一些代码以读取镶木地板文件时,它告诉我它无法解码。这告诉我编写器代码是错误的(尽管如果它不能创建有效的 parquet 文件,它肯定会抛出异常?)
这里是编写代码:
val avroSchema: Schema = ReflectData.get().getSchema(classOf[Program])
val parquetOutputPath = new org.apache.hadoop.fs.Path(outputFilePath)
val parquetWriter = new AvroParquetWriter[Record](parquetOutputPath, avroSchema)
programs.foreach(program => {
val programRecord = new GenericData.Record(avroSchema)
programRecord.put("name", program.getName)
parquetWriter.write(programRecord)
})
parquetWriter.close()
这里是阅读代码:
val avroSchema: Schema = ReflectData.get().getSchema(classOf[Program])
val filePath = new org.apache.hadoop.fs.Path(filePathString)
val parquetReader = new AvroParquetReader[Record](filePath)
val record = parquetReader.read()
读取代码最后一行抛出如下异常:
.ParquetDecodingException: 无法读取文件 file:/tmp/parquet/test-1506962769.parquet 中块 0 中 1 处的值
希望有人能指出正确的方向,否则我可能不得不使用 Apache Spark,因为它能够轻松创建 parquet 文件,这有点过头了。
【问题讨论】: