`

RcFile存储和读取操作

阅读更多
工作中用到了RcFile来存储和读取RcFile格式的文件,记录下。
RcFile是FaceBook开发的一个集行存储和列存储的优点于一身,压缩比更高,读取列更快,它在MapReduce环境中大规模数据处理中扮演着重要的角色。
读取操作:
job信息:
	    Job job = new Job();
            job.setJarByClass(类.class);
		//设定输入文件为RcFile格式
            job.setInputFormatClass(RCFileInputFormat.class);  
		//普通输出
            job.setOutputFormatClass(TextOutputFormat.class);
		//设置输入路径
            RCFileInputFormat.addInputPath(job, new Path(srcpath));
            //MultipleInputs.addInputPath(job, new Path(srcpath), RCFileInputFormat.class);
		// 输出
            TextOutputFormat.setOutputPath(job, new Path(respath));
            // 输出key格式
            job.setOutputKeyClass(Text.class);  
		//输出value格式
            job.setOutputValueClass(NullWritable.class);  
		//设置mapper类
            job.setMapperClass(ReadTestMapper.class);
		//这里没设置reduce,reduce的操作就是读Text类型文件,因为mapper已经给转换了。
            
            code = (job.waitForCompletion(true)) ? 0 : 1;


// mapper 类

pulic class ReadTestMapper extends Mapper<LongWritable, BytesRefArrayWritable, Text, NullWritable> {
        
        @Override
        protected void map(LongWritable key, BytesRefArrayWritable value, Context context) throws IOException, InterruptedException {
            // TODO Auto-generated method stub
            Text txt = new Text(); 
		//因为RcFile行存储和列存储,所以每次进来的一行数据,Value是个列簇,遍历,输出。
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < value.size(); i++) {
                BytesRefWritable v = value.get(i);
                txt.set(v.getData(), v.getStart(), v.getLength());
                if(i==value.size()-1){
                    sb.append(txt.toString());
                }else{
                    sb.append(txt.toString()+"\t");
                }
            }
            context.write(new Text(sb.toString()),NullWritable.get());
            }
        }



输出压缩为RcFile格式:
job信息:
            Job job = new Job();
            Configuration conf = job.getConfiguration();
		//设置每行的列簇数
            RCFileOutputFormat.setColumnNumber(conf, 4);
            job.setJarByClass(类.class);

            FileInputFormat.setInputPaths(job, new Path(srcpath));
            RCFileOutputFormat.setOutputPath(job, new Path(respath));

            job.setInputFormatClass(TextInputFormat.class);
            job.setOutputFormatClass(RCFileOutputFormat.class);

            job.setMapOutputKeyClass(LongWritable.class);
            job.setMapOutputValueClass(BytesRefArrayWritable.class);

            job.setMapperClass(OutPutTestMapper.class);

            conf.set("date", line.getOptionValue(DATE));
		//设置压缩参数
            conf.setBoolean("mapred.output.compress", true);
            conf.set("mapred.output.compression.codec", "org.apache.hadoop.io.compress.GzipCodec");

            code = (job.waitForCompletion(true)) ? 0 : 1;

mapper类:
    public class OutPutTestMapper extends Mapper<LongWritable, Text, LongWritable, BytesRefArrayWritable> {
        @Override
        public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            String line = value.toString();
            String day = context.getConfiguration().get("date");
            if (!line.equals("")) {
                String[] lines = line.split(" ", -1);
                if (lines.length > 3) {
                    String time_temp = lines[1];
                    String times = timeStampDate(time_temp);
                    String d = times.substring(0, 10);
                    if (day.equals(d)) {
                        byte[][] record = {lines[0].getBytes("UTF-8"), lines[1].getBytes("UTF-8"),lines[2].getBytes("UTF-8"), lines[3].getBytes("UTF-8")};

                        BytesRefArrayWritable bytes = new BytesRefArrayWritable(record.length);

                        for (int i = 0; i < record.length; i++) {
                            BytesRefWritable cu = new BytesRefWritable(record[i], 0, record[i].length);
                            bytes.set(i, cu);
                        }
                        context.write(key, bytes);
                    }
                }
            }
        }




转载,请超链接形式标明文章原始出处和作者。
永久链接: http://smallboby.iteye.com/blog/1592531。
感谢。不当之处,请指教。
分享到:
评论
2 楼 yiqi1943 2014-07-14  
timeStampDate函数没找到
1 楼 yiqi1943 2014-07-04  
您用的hadoop和hive的版本是什么呢?

相关推荐

    Facebook数据仓库揭秘之RCFile高效存储结构.docx

    RCFile结合了行存储和列存储的优势,旨在解决大数据处理中的四大关键需求:快速数据加载、快速查询处理、高效存储空间利用以及对高动态工作负载模式的强大适应性。 #### 数据仓库的关键需求 1. **快速数据加载...

    faceback数据仓库揭秘

    本文将深入探讨Facebook数据仓库中的一项关键技术——RCFile存储结构,这一结构结合了行存储和列存储的优点,在MapReduce环境下实现了高效的大规模数据分析。 ### RCFile存储结构概述 RCFile,全称为Record ...

    Facebook数据仓库

    Facebook数据仓库的RCFile存储结构是大数据时代的一个典范,它不仅展示了如何创新地解决数据处理中的常见难题,还为其他企业提供了宝贵的经验和启示。通过深入理解RCFile的核心原理和优势,我们可以更好地设计和优化...

    7、大数据中常见的文件存储格式以及hadoop中支持的压缩算法

    - 列式存储将同一列的数据放在一起,更适合大数据分析和查询,因为只需读取所需列的数据,减少了I/O操作。 3. **Text File** - 最基础的文本格式,易于理解和调试,但不支持块级别的压缩,读取成本较高。 4. **...

    Facebook数据仓库揭秘

    RCFile作为一种创新的数据存储结构,成功地将行存储和列存储的优点融合在一起,从而解决了传统数据存储格式在处理大规模数据分析时存在的局限性。通过对RCFile的理解和应用,我们可以更好地应对现代数据仓库所面临的...

    藏经阁-Apache Spark系列技术直播# 第七讲 【 大数据列式存储之 Parquet_ORC 】.pdf

    这种存储方式可以提高存储效率、实现快速的数据过滤和跳过、并且支持矢量化操作。Apache Parquet和Apache ORC都是基于列式存储的技术。 Parquet概述 Apache Parquet是一种基于列式存储的文件格式,设计基于Google...

    hive rc文件的有关文档

    由于采用了列式存储技术,RCFile能够针对特定列进行压缩和编码,这使得在查询处理时可以只读取需要的列数据,大大提高了查询效率。同时,列式存储也支持更高效的聚合操作和过滤条件应用。 ##### 3. 高效存储空间...

    宽表列存储在大数据分析中的应用与优化.pdf

    例如,HDFS(Hadoop Distributed File System)作为大数据分析的常用存储系统,支持多种列式存储格式,如Text File、Sequential File、RCFile、ORC(Optimized Row Columnar)和Parquet等。其中,RCFile由Yongqiang ...

    大数据采集技术-DataX中的HDFS插件配置.pptx

    在本文件中,我们将重点讨论DataX中的HDFS插件配置,包括读取和写入配置,以便更好地理解如何利用该工具处理Hadoop Distributed File System (HDFS) 上的数据。 **1. HDFS插件读取配置** HdfsReader是DataX用于从...

    hive优化(ppt)

    RCFile(Record Columnar File)是一种列式存储格式,相较于传统的LZO压缩文本文件,RCFile能够提供更好的压缩率和更快的查询速度。此外,启用压缩临时文件`mapred.compress.map.output=true`可以进一步减少中间数据...

    《Hadoop&Spark;原理、运维、与开发》.pdf

    此外,Hadoop平台上的列存储技术,如RCFile、ORC和Parquet文件格式等,都被逐一介绍,这些都是处理大数据时提高效率的关键技术。 在Hadoop和Spark的部署和配置章节中,作者指导读者如何在虚拟机集群上安装JDK,如何...

    阿里巴巴Hive学习笔记.docx

    总的来说,《阿里巴巴Hive学习笔记》是一份详尽的资料,旨在帮助读者理解Hive的核心概念和操作,从而更好地利用Hive处理和分析海量数据。对于希望进入大数据领域的学习者来说,这是一份宝贵的资源。

    hive-0.8.1

    这些元数据帮助Hive理解如何在HDFS(Hadoop Distributed File System)上定位和操作数据。 2. **HQL(Hive Query Language)**:HQL是Hive的查询语言,它为用户提供了SQL风格的接口,使不熟悉MapReduce编程的人员也...

    新一代数据湖技术Iceberg应用.pptx

    Snapshot记录数据的状态变化,manifest list则用于追踪数据文件和元数据,这种设计提供了高效的读取和删除操作,同时保证了数据的一致性和可靠性。 综上所述,Apache Iceberg通过其独特的设计和优化,成功解决了...

    大数据技术之impala.docx

    - 支持多种文件格式:包括TEXTFILE、SEQUENCEFILE、RCFile和Parquet等,以适应不同的数据存储需求。 - Hive元数据共享:可以直接使用Hive的元数据服务,对Hive数据进行即时分析。 2. Impala的局限性 - 内存依赖...

    华为大数据认证HCIP-Big Data Developer H13-723大数据题库

    FileSystem类用于操作文件系统,比如读取和写入HDFS上的文件。Context类用于执行MapReduce作业的上下文。因此,答案为A.Job。 3. FusionInsightHD系统中Oozie作业提交:Oozie是一个用于管理和调度Hadoop作业的工作...

    新一代数据湖技术Iceberg应用.pdf

    随着计算引擎(如Spark、Presto、Impala)和存储格式(如Text、RCFile、ORCFile、Parquet)的发展,新一代数据湖技术应运而生,旨在解决这些问题。 Delta Lake、Hudi和Iceberg是当前流行的开源数据湖解决方案。它们...

Global site tag (gtag.js) - Google Analytics