JSONからORCへの変換プロセスを自動化する必要があります。 JsonReaderがマップタイプとthrows an exceptionを処理しない点を除いて、私はApacheのORC-toolsパッケージを使用してほぼそこに到達することができました。したがって、以下は動作しますが、マップタイプは処理されません。Java:ファイルからJSONを読み込み、ORCに変換してファイルに書き込む
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);
}
}
}
だから、私は将来的に、私はマイナーコードの変更と、このようなAVROなどの他の形式に変換することができます追加の利点を持っているJSONツーORC変換用のハイブクラスを使用してに探し始めました。しかし、私は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を行う簡単な方法については、大変感謝しています。ここで
正直なところ、Spark/Pig /実際のHiveQLを使用してこれを行います –
マップは通常のJSONオブジェクトと似ていませんか?したがって、構造を誇示するのか? –
cricket_007、このJSONからORCへの変換は、すでにJSONデータを受け取っている他のもの(アーカイブなど)を行うWebサービスの一部として行う必要があります。したがって、Spark/Hiveジョブでこの変換を行うことは、JSONデータをこれらのジョブに再送信する必要があるため、私たちの選択肢ではありません(他の場所でこの変換に使用しましたが)。 – alecswan