thrift、序列化与parquet读取
来源:互联网 发布:淘宝客推广链接 编辑:程序博客网 时间:2024/05/16 12:28
parquet是一种常见的列式存储格式,普通的parquet文件可以用java中的ParquetReader<Group>来读取,在存储格式较为简单时,可以通过Group.get×××可以获得相应列的数据,获得相应json格式数据(手动拼接)的代码如下:
// 获取字段信息ParquetMetadata readFooter = ParquetFileReader.readFooter(fs.getConf(), filePath,ParquetMetadataConverter.NO_FILTER);MessageType schema = readFooter.getFileMetaData().getSchema();List<Type> colTypes = schema.getFields();ParquetReader<Group> reader = ParquetReader.builder(new GroupReadSupport(), filePath).withConf(fs.getConf()).build();Group recordData = reader.read();// 先拼成json格式while (recordData != null) {StringBuilder builder = new StringBuilder();builder.append("{");for (int j = 0; j < colTypes.size(); j++) {// 获得字段名和值String columnName = colTypes.get(j).getName();String value = recordData.getValueToString(j, 0);builder.append("\"" + columnName + "\":\"" + value+ "\"");builder.append(j == colTypes.size() - 1 ? "}" : ",");}buffers.add(builder.toString());recordData = reader.read();}
但当文件通过Thrift进行序列化(自定义的serialization.class)后,直接Group.toString()查看获取到的整个字段内容,发现它为如下格式:
root1
key1:val1
key2
subkey1:subval1
key3
root2
root3
...
这种格式依然可以通过group读取,但在一些特定字段不存在时,get方法会抛出异常,并且代码看起来非常凌乱,上文的数据样例,如果想要获取subval1的值,假设字段类型为String,则需要group.getGroup("root1",0).getGroup("key2",0).getString("subkey1",0),这样的方式,其中,get方法的第二个参数为第k个名称为var的数据,同时,还需要catch住因为中间字段不存在的情况而抛出的异常。
因此,为了避免不必要的麻烦(当然,如果你仅仅需要一个数据,或是整个group都需要,当我没说),通过Thrift序列化的数据,可以通过ThriftParquetReader进行反序列化读取,直接将内容读取至对应的class中。方法如下:
ParquetReader<T> parquetReader = ThriftParquetReader.<T> build(filePath).withThriftClass(<ClassT>).build();T objectT = parquetReader.read();
阅读全文
0 0
- thrift、序列化与parquet读取
- Thrift序列化与反序列化
- spark读取gz文件与parquet文件
- python 使用thrift序列化与反序列化对象
- python 使用thrift序列化与反序列化对象
- spark 读取hive parquet
- Thrift 的序列化机制
- Thrift 的序列化机制
- thrift序列化(java版)
- spark读取json,parquet文件
- NSCoding序列化存储与读取
- Thrift序列化与反序列化的实现机制分析
- thrift序列化和反序列化
- thrift序列化和反序列化
- 通信协议与序列化方案的纠结: Protocol Buffer, thrift or hessian?
- Thrift源码解析(二)序列化协议
- java序列化读取与文本文件读取数据效率对比
- java序列化读取与文本文件读取数据效率对比
- 使用命令连接
- 1254-面向对象程序设计上机练习八(对象数组)
- bzoj2463: [中山市选2009]谁能赢呢?
- string和数值的相互转换
- @符号在c#的中的作用
- thrift、序列化与parquet读取
- jdk 生成cxf文件
- 快慢指针-141. Linked List Cycle
- 静态链接和动态链接
- crest value &minimum
- java中后台返回前台数据中文乱码的问题
- AFTER触发器与INSTEAD OF触发器的区别
- Spring中BeanFactory、ApplicationContext、xml的作用
- 修改tomcat编码格式