我需要自动化json到orc的转换过程。通过使用apache的orc工具包,我几乎可以做到这一点,除了jsonreader is不处理Map类型并抛出异常。所以,下面的代码可以工作,但不能处理map类型。
Path hadoopInputPath = new Path(input);
try (RecordReader recordReader = new JsonReader(hadoopInputPath, schema, hadoopConf)) { // throws when schema contains Map type
try (Writer writer = OrcFile.createWriter(new Path(output), OrcFile.writerOptions(hadoopConf).setSchema(schema))) {
VectorizedRowBatch batch = schema.createRowBatch();
while (recordReader.nextBatch(batch)) {
writer.addRowBatch(batch);
}
}
}
因此,我开始考虑使用hive类进行json到orc的转换,这有一个额外的优势,将来我可以转换成其他格式,比如avro,只需稍作代码更改。但是,我不确定使用hive类实现这一点的最佳方法是什么。具体来说,不清楚如何将hcatrecord写入如下所示的文件。
HCatRecordSerDe hCatRecordSerDe = new HCatRecordSerDe();
SerDeUtils.initializeSerDe(hCatRecordSerDe, conf, tblProps, null);
OrcSerde orcSerde = new OrcSerde();
SerDeUtils.initializeSerDe(orcSerde, conf, tblProps, null);
Writable orcOut = orcSerde.serialize(hCatRecord, hCatRecordSerDe.getObjectInspector());
assertNotNull(orcOut);
InputStream input = getClass().getClassLoader().getResourceAsStream("test.json.snappy");
SnappyCodec compressionCodec = new SnappyCodec();
try (CompressionInputStream inputStream = compressionCodec.createInputStream(input)) {
LineReader lineReader = new LineReader(new InputStreamReader(inputStream, Charsets.UTF_8));
String jsonLine = null;
while ((jsonLine = lineReader.readLine()) != null) {
Writable jsonWritable = new Text(jsonLine);
DefaultHCatRecord hCatRecord = (DefaultHCatRecord) jsonSerDe.deserialize(jsonWritable);
// TODO: Write ORC to file????
}
}
任何关于如何完成以上代码的想法,或者用更简单的方法将json转换为orc的想法都将受到极大的赞赏。
1条答案
按热度按时间cyej8jka1#
根据cricket\u 007的建议,我最终使用了spark库:
maven依赖项(有一些排除项可以让maven duplicate finder插件满意):
java代码概要:
希望这能帮助别人开始。