Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从文件中读取JSON,转换为ORC并写入文件_Java_Json_Apache_Hive_Orc - Fatal编程技术网

Java:从文件中读取JSON,转换为ORC并写入文件

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

我需要自动化JSON到ORC的转换过程。通过使用Apache的ORC工具包,我几乎可以做到这一点,除了JsonReader不处理映射类型和。因此,下面的代码可以工作,但不能处理映射类型

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作业进行这种转换对我们来说并不是一个真正的选择(即使我们在这家公司使用了它们)