【发布时间】:2018-02-27 15:26:23
【问题描述】:
我需要自动化 JSON 到 ORC 的转换过程。我几乎可以通过使用 Apache 的 ORC-tools 包到达那里,除了 JsonReader 不处理 Map 类型和 throws an exception。因此,以下工作但不处理 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-to-ORC 的更简单方法的想法将不胜感激。
【问题讨论】:
-
老实说,我会使用 Spark / Pig / 实际的 HiveQL 来做到这一点
-
Map 不就和普通的 JSON 对象一样吗?因此是 Hive 的结构?
-
cricket_007,这种 JSON 到 ORC 的转换需要作为 Web 服务的一部分来完成,该服务已经接收 JSON 数据并用它做其他事情,例如归档。因此,使用 Spark/Hive 作业进行这种转换对我们来说并不是一个真正的选择(即使我们在其他地方使用它们进行这种转换),因为它也需要将 JSON 数据重新发送到这些作业。
-
我看不出您不能在 Web 服务器中创建 SparkContext 的任何原因
-
在我之前的评论中我提到了 Spark,但实际上我们只是使用 Hive 查询来做这种格式转换,所以我不太熟悉如何使用 SparkContext 来做这样的事情。我将使用哪些 Spark java 类进行转换?任何代码示例或指向 JavaDocs 的链接都会非常有帮助。