使用Java API将txt文件转换为orc文件

文章        orc文件是hive中重要文件格式,在大数据中具有广泛的应用场景。orc文件是二进制文件,不能直接进行读取或者写入,这里介绍如何通过Java API将普通规范式文件转换为orc文件,并且将orc文件读到控制台。关于orc文件格式,这里不做详细介绍,有需要请参考文章,或者orc官网。

目录

         1,第一步,添加相关依赖(出处来源于官网),测试该程序时应具备Hadoop的相关环境依赖。

2,确定我们转换的数据格式,我测试时的数据格式如下:

3,话不多说,先上代码!

4,结果验证

5,代码解读


         1,第一步,添加相关依赖(出处来源于官网),测试该程序时应具备Hadoop的相关环境依赖。


  
    org.apache.orc
    orc-mapreduce
    1.1.0
  
  
    org.apache.hadoop
    hadoop-mapreduce-client-core
    2.7.0
  

2,确定我们转换的数据格式,我测试时的数据格式如下:

 使用Java API将txt文件转换为orc文件_第1张图片

 该数据时用Java程序随机生成的,第一列为数据索引,第二列为随机生成的单词,第三列为随机  生成的五位数,第五列为随机生成的一个汉字。我本人在进行测试的时候,生成了520M数据。

3,话不多说,先上代码!

package com.atguigu.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
import org.apache.orc.CompressionKind;
import org.apache.orc.OrcFile;
import org.apache.orc.TypeDescription;
import org.apache.orc.Writer;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class WriteBigTextToOrc {

    public static void main(String[] args) throws IOException {

        String filePath = "data/normal/cyhData500.txt";
        writeOrc(filePath);
    }
    public static void writeOrc(String fileName) throws IOException {
        Configuration conf = new Configuration();
        //确定每一列的数据类型
        TypeDescription schema = TypeDescription.createStruct()
                .addField("filed1",TypeDescription.createInt())
                .addField("filed2",TypeDescription.createString())
                .addField("filed3",TypeDescription.createInt())
                .addField("filed4",TypeDescription.createString());

        //输出orc文件到本地路径
        String path = "data/orc/zlib/cyhOrc500.orc";
        //设置写入流时的参数,
        Writer writer = OrcFile.createWriter(new Path(path),OrcFile.writerOptions(conf)
                .setSchema(schema)
                .stripeSize(67108864)
                .bufferSize(64*1024)
                .blockSize(128*1024*1024)
                .rowIndexStride(10000)
                .blockPadding(true)
                //默认压缩算法为zlib,zlib相对于snappy压缩算法,压缩比更低,压缩效果更好,但是花费了更多的压缩时间
                .compress(CompressionKind.ZLIB));

        File file = new File(fileName);
        BufferedReader reader = null;
        reader = new BufferedReader(new FileReader(file));
        VectorizedRowBatch batch = schema.createRowBatch();
        //获取每一列的引用
        LongColumnVector a = (LongColumnVector) batch.cols[0];
        BytesColumnVector b = (BytesColumnVector) batch.cols[1];
        LongColumnVector c = (LongColumnVector) batch.cols[2];
        BytesColumnVector d = (BytesColumnVector) batch.cols[3];
        String tempString = null;
        //测试转换时间
        long start = System.currentTimeMillis();
        //开始转换成二进制的orc文件
        while ((tempString = reader.readLine())!=null){
            int row = batch.size++;
            String[] contents = tempString.split(" ");
            //int,double,long等数据类型用  引用.vector
            a.vector[row] = Integer.parseInt(contents[0]);
            //String等数据类型用 引用.setVal
            b.setVal(row,contents[1].getBytes());
            c.vector[row] = Integer.parseInt(contents[2]);
            d.setVal(row,contents[3].getBytes());
            writer.addRowBatch(batch);
            batch.reset;
           
        }
        long stop = System.currentTimeMillis();
        System.out.println("将text文件转换为orc文件花费的时间是 "+(stop-start)/1000+"秒");

        writer.close();

    }
}

4,结果验证

        使用Java API将txt文件转换为orc文件_第2张图片

 发现生成了一个 .orc 文件和一个 .crc文件,.orc问价是我们的目标文件,打开发现全部为二进制代码。在这里我们进行测试,将orc文件读取读取出来,这里我们可以继续用Java API进行读取,但是这里我推荐用 hive里面提供的方法读取,读取步骤如下:

        1,在Hadoop中配置hive(在网上自己教程,过程很easy)

        2,创建表:

                

create table orcfile(
filed1 int,
filed2 string,
filed3 int,
filed4 string
) stored as orc;

        3,导入数据 将生成的数据先拉进虚拟机中。执行命令load data local inpath '导入的orc文件路径' overwrite into table orcFile;

        

        4,查询数据 

        最后就 执行 select * from orcfile;

        如果发现有空值,检查,创建表和和代码的filed是否对应。

         使用Java API将txt文件转换为orc文件_第3张图片使用Java API将txt文件转换为orc文件_第4张图片

5,代码解读

代码实现思路如下:1,首先确定每一列的数据类型,生成该列的数据类型引用(addfiled),2,设置orc文件的输出路径。3,设置writer(写入到orc文件)时的参数。4,获取每一列的引用。5,利用获取的引用开始继续循环转换。(待完善)

你可能感兴趣的:(orc,hadoop,hdfs,大数据,hive)