Ich muss den JSON-zu-ORC-Konvertierungsprozess automatisieren. Ich konnte fast mit dem ORC-tools-Paket von Apache dorthin gelangen, außer dass JsonReader nicht mit Map type und throws an exception umgehen kann. Das Folgende funktioniert, aber nicht mit dem Kartentyp.Java: JSON aus einer Datei lesen, in ORC konvertieren und in eine Datei schreiben
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);
}
}
}
So begann ich in der Suche unter Verwendung von Hive Klassen für Json-to-ORC Umwandlung, die einen zusätzlichen Vorteil hat, dass ich in Zukunft in anderen Formaten, wie AVRO mit geringfügigen Änderungen am Code umwandeln kann. Ich bin mir jedoch nicht sicher, was der beste Weg ist, dies mit Hive-Klassen zu tun. Insbesondere ist es nicht klar, wie HCatRecord in eine Datei geschrieben wird, wie unten gezeigt.
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????
}
}
Alle Ideen, wie Sie den Code oben oder einfachere Möglichkeiten zu tun, JSON-to-ORC abzuschließen sehr geschätzt wird. Hier
Ehrlich, würde ich Spark/Pig/tatsächlichen HiveQL verwenden, um dies zu tun –
Ist eine Map nicht wie ein normales JSON-Objekt? Also ein Struct to Hive? –
cricket_007, diese JSON-zu-ORC-Konvertierung muss als Teil eines Webdienstes ausgeführt werden, der bereits JSON-Daten empfängt und andere Dinge damit erledigt, z. B. die Archivierung. Daher ist es nicht wirklich eine Option für uns, diese Konvertierung mit Spark/Hive-Jobs durchzuführen (obwohl wir sie an anderen Stellen für diese Konvertierung verwendet haben), da es erforderlich sein wird, JSON-Daten erneut an diese Jobs zu senden. – alecswan