通过Avro 将文件合并

简介:

Avro合并本地文件

package com.zhiyou100.mr;

import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;

import org.apache.avro.Schema;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.FileUtils;
import org.apache.hadoop.fs.FileUtil;

import com.zhiyou100.schema.SmallFile;

public class AvroMergeSmallFile {

private Schema.Parser parse = new Schema.Parser();
private Schema schema;
private List<String> inputFilePaths = new ArrayList<String>();

private AvroMergeSmallFile() {
    schema = SmallFile.getClassSchema();
}

public void addInputFileDir(String inputDir) throws IOException {
    // 获取出文件夹下的所有文件
    File[] files = FileUtil.listFiles(new File(inputDir));
    // 把文件路径添加到inputFilePaths中
    for (File file : files) {
        inputFilePaths.add(file.getPath());
    }
}

// 把inputFilePaths中所有文件合并到一个avro文件中
public void mergeFile(String outputPath) throws IOException {
    DatumWriter<SmallFile> writer = new SpecificDatumWriter<SmallFile>();
    DataFileWriter<SmallFile> fileWriter = new DataFileWriter<SmallFile>(writer);
    fileWriter.create(SmallFile.getClassSchema(), new File(outputPath));
    // 把inputFilePath的文件一个个读取出来根据模式放入到avro文件中
    for (String filePath : inputFilePaths) {
        File inputFile = new File(filePath);
        byte[] content = FileUtils.readFileToByteArray(inputFile);

        SmallFile oneSmallFile = SmallFile.newBuilder().setFileName(inputFile.getAbsolutePath())
                .setContent(ByteBuffer.wrap(content)).build();
        fileWriter.append(oneSmallFile);
        System.out.println("写入" + inputFile.getAbsolutePath() + "成功"+DigestUtils.md5Hex(content));

    }
    fileWriter.flush();
    fileWriter.close();
}
//读取大avro中的文件
public void readMergedFile (String avrofile) throws IOException{
    DatumReader<SmallFile> reader =new SpecificDatumReader<SmallFile>();
    DataFileReader<SmallFile>fileReader =new DataFileReader<SmallFile>(new File(avrofile), reader);
    SmallFile smallFile =null;
    while(fileReader.hasNext()){
        smallFile=fileReader.next();
        System.out.println("文件名:"+smallFile.getFileName());
        System.out.println("文件内容:"+new String(smallFile.getContent().array().toString()));
        System.out.println("文件MD5"+DigestUtils.md5Hex(smallFile.getContent().array()));
    }
}

public static void main(String[] args) throws IOException {
    AvroMergeSmallFile avroMergeSmallFile =new AvroMergeSmallFile();
    avroMergeSmallFile.addInputFileDir("C:\\Users\\Administrator\\Desktop\\reversetext");
    avroMergeSmallFile.mergeFile("C:\\Users\\Administrator\\Desktop\\AvroMErgeSmallFile");
    avroMergeSmallFile.readMergedFile("C:\\Users\\Administrator\\Desktop\\AvroMErgeSmallFile");
}

}

相关文章
|
11月前
|
SQL JSON 缓存
你了解 SpringBoot 在一次 http 请求中耗费了多少内存吗?
在工作中常需进行全链路压测并优化JVM参数。通过实验可精确计算特定并发下所需的堆内存,并结合JVM新生代大小估算GC频率,进而优化系统。实验基于SpringBoot应用,利用JMeter模拟并发请求,分析GC日志得出:单次HTTP请求平均消耗约34KB堆内存。复杂环境下,如公司线上环境,单次RPC请求内存消耗可达0.5MB至1MB,揭示了高并发场景下的内存管理挑战。
|
前端开发 JavaScript UED
CSS进阶 - CSS性能优化
【6月更文挑战第17天】**CSS性能优化关乎美观与速度。减少无用和重复样式,简化选择器,避免频繁重绘与回流,预加载关键CSS,以及模块化代码,能提升加载速度和用户体验。通过代码审查、工具辅助、选择器优化、使用transform和opacity、CSS预加载、以及文件拆分和模块化,开发者可应对复杂网页的性能挑战。**
195 2
|
11月前
|
机器学习/深度学习 数据采集 数据挖掘
深度学习之地形分类与变化检测
基于深度学习的地形分类与变化检测是遥感领域的一个关键应用,利用深度学习技术从卫星、无人机等地球观测平台获取的遥感数据中自动分析地表特征,并识别地形的变化。这一技术被广泛应用于城市规划、环境监测、灾害预警、土地利用变化分析等领域。
695 0
|
10月前
|
SQL 人工智能 安全
网络安全的盾牌:漏洞防护与加密技术解析
在数字时代的浪潮中,网络安全和信息安全成为了维护社会稳定和保护个人隐私的关键。本文将深入探讨网络安全中的常见漏洞、先进的加密技术以及提升安全意识的重要性。通过分析网络攻击的手法,揭示防御策略的构建过程,并分享实用的代码示例,旨在为读者提供一套全面的网络安全知识体系,以增强个人和组织在网络空间的防御能力。
|
10月前
|
运维 监控 网络协议
网络诊断必备:Ping、Traceroute、Wireshark的实用技巧详解
网络诊断必备:Ping、Traceroute、Wireshark的实用技巧详解
2063 0
|
存储 NoSQL 关系型数据库
可以存储文件的数据库有哪些?
可以存储文件的数据库有哪些?
1256 6
|
存储 SQL 机器学习/深度学习
阿里云数加大数据计算服务MaxCompute学习路线图:从入门到精通
将所学知识应用于实际工作中并不断进行实践和创新是提升技术能力的关键所在。用户可以结合业务需求和技术发展趋势积极探索新的应用场景和解决方案,并在实践中不断总结经验和教训以提升自己的技术水平和实践能力。
|
缓存 NoSQL 关系型数据库
|
SQL 存储 安全
SQL数据库:核心原理、应用实践与未来展望
在电子商务领域,SQL数据库用于存储商品信息、用户信息、订单信息等。通过SQL数据库,电商平台可以实现商品的快速检索、用户行为的跟踪分析、订单状态的实时更新等功能,提升用户体验和运营效率。
|
SQL 运维 网络协议
配置使用SNMPv2c与网管通信示例
简单网络管理协议SNMP(Simple Network Management Protocol)是广泛应用于TCP/IP网络的网络管理标准协议。SNMP提供了通过运行网络管理软件的中心计算机(即网络管理工作站)来管理设备的方法。
202 0