Java:从文件中读取JSON,转换为ORC并写入文件
我需要自动化JSON到ORC的转换过程。通过使用Apache的ORC工具包,我几乎可以做到这一点,除了JsonReader不处理映射类型和。因此,下面的代码可以工作,但不能处理映射类型Java:从文件中读取JSON,转换为ORC并写入文件,java,json,apache,hive,orc,Java,Json,Apache,Hive,Orc,我需要自动化JSON到ORC的转换过程。通过使用Apache的ORC工具包,我几乎可以做到这一点,除了JsonReader不处理映射类型和。因此,下面的代码可以工作,但不能处理映射类型 Path hadoopInputPath = new Path(input); try (RecordReader recordReader = new JsonReader(hadoopInputPath, schema, hadoopConf)) { // throws when schema con
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);
}
}
}
因此,我开始考虑使用配置单元类进行Json到ORC的转换,这有一个额外的优势,在将来我可以转换为其他格式,比如AVRO,只需稍作代码更改。但是,我不确定使用配置单元类实现这一点的最佳方法是什么。具体来说,不清楚如何将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的方法的想法都将不胜感激。以下是我根据cricket的建议使用Spark库所做的工作: Maven依赖性(有一些排除以使Maven duplicate finder插件满意):
2.7.9
2.2.0
2.11
com.fasterxml.jackson.module
jackson-module-scala_${scala.binary.version}
${dep.jackson.version}
番石榴
番石榴
org.apache.spark
spark-hive_${scala.binary.version}
${spark.version}
log4j
apache-log4j-extras
org.apache.hadoop
hadoop客户端
net.java.dev.jets3t
jets3t
com.google.code.findbugs
jsr305
斯塔克斯
斯塔克斯api
org.objenesis
正视
Java代码概要:
SparkConf sparkConf = new SparkConf()
.setAppName("Converter Service")
.setMaster("local[*]");
SparkSession sparkSession = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate();
// read input data
Dataset<Row> events = sparkSession.read()
.format("json")
.schema(inputConfig.getSchema()) // StructType describing input schema
.load(inputFile.getPath());
// write data out
DataFrameWriter<Row> frameWriter = events
.selectExpr(
// useful if you want to change the schema before writing it to ORC, e.g. ["`col1` as `FirstName`", "`col2` as `LastName`"]
JavaConversions.asScalaBuffer(outputSchema.getColumns()))
.write()
.options(ImmutableMap.of("compression", "zlib"))
.format("orc")
.save(outputUri.getPath());
SparkConf SparkConf=new SparkConf()
.setAppName(“转换器服务”)
.setMaster(“本地[*]”);
SparkSession SparkSession=SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate();
//读取输入数据
数据集事件=sparkSession.read()
.格式(“json”)
.schema(inputConfig.getSchema())//描述输入架构的结构类型
.load(inputFile.getPath());
//写出数据
DataFrameWriter frameWriter=事件
.selectExpr(
//如果要在将架构写入ORC之前更改架构,例如,[“`col1`作为`FirstName`'”、“`col2`作为`LastName`”]
JavaConversions.asScalaBuffer(outputSchema.getColumns())
.write()
.options(不可变映射(“压缩”、“zlib”))
.格式(“orc”)
.save(outputUri.getPath());
希望这有助于某人入门。以下是我根据cricket\u 007建议使用Spark库所做的工作: Maven依赖性(有一些排除以使Maven duplicate finder插件满意):
2.7.9
2.2.0
2.11
com.fasterxml.jackson.module
jackson-module-scala_${scala.binary.version}
${dep.jackson.version}
番石榴
番石榴
org.apache.spark
spark-hive_${scala.binary.version}
${spark.version}
log4j
apache-log4j-extras
org.apache.hadoop
hadoop客户端
net.java.dev.jets3t
jets3t
com.google.code.findbugs
jsr305
斯塔克斯
斯塔克斯api
org.objenesis
正视
Java代码概要:
SparkConf sparkConf = new SparkConf()
.setAppName("Converter Service")
.setMaster("local[*]");
SparkSession sparkSession = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate();
// read input data
Dataset<Row> events = sparkSession.read()
.format("json")
.schema(inputConfig.getSchema()) // StructType describing input schema
.load(inputFile.getPath());
// write data out
DataFrameWriter<Row> frameWriter = events
.selectExpr(
// useful if you want to change the schema before writing it to ORC, e.g. ["`col1` as `FirstName`", "`col2` as `LastName`"]
JavaConversions.asScalaBuffer(outputSchema.getColumns()))
.write()
.options(ImmutableMap.of("compression", "zlib"))
.format("orc")
.save(outputUri.getPath());
SparkConf SparkConf=new SparkConf()
.setAppName(“转换器服务”)
.setMaster(“本地[*]”);
SparkSession SparkSession=SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate();
//读取输入数据
数据集事件=sparkSession.read()
.格式(“json”)
.schema(inputConfig.getSchema())//描述输入架构的结构类型
.load(inputFile.getPath());
//写出数据
DataFrameWriter frameWriter=事件
.selectExpr(
//如果要在将架构写入ORC之前更改架构,例如,[“`col1`作为`FirstName`'”、“`col2`作为`LastName`”]
JavaConversions.asScalaBuffer(outputSchema.getColumns())
.write()
.options(不可变映射(“压缩”、“zlib”))
.格式(“orc”)
.save(outputUri.getPath());
希望这能帮助一些人入门。老实说,我会使用Spark/Pig/actual-HiveQL来做这件事。这不是一个像普通JSON对象那样的映射吗?因此,从Struct到Hive?cricket_007,这个JSON到ORC的转换需要作为web服务的一部分来完成,web服务已经接收JSON数据并使用它做其他事情,例如归档。因此,使用Spark/Hive作业进行此转换实际上不是我们的选择(即使我们在其他地方使用了它们进行此转换),因为它也需要将JSON数据重新发送到这些作业。我不认为有任何理由不能在web服务器内创建SparkContext在我之前提到的Spark评论中,但事实上,我们只使用配置单元查询来进行这种格式转换,所以我不太熟悉如何使用SparkContext进行类似的转换。我将使用什么Spark java类来进行转换?任何代码示例或指向JavaDocs的链接都会非常有用。老实说,我会使用Spark/Pig/actual-HiveQL来实现这一点。这不是一个像常规JSON对象那样的映射吗?因此,从Struct到Hive?cricket_007,这个JSON到ORC的转换需要作为web服务的一部分来完成,web服务已经接收JSON数据并使用它做其他事情,例如归档。因此,使用Spark/Hive作业进行这种转换对我们来说并不是一个真正的选择(即使我们在这家公司使用了它们)