本篇文章主要介绍了java 读写Parquet格式的数据的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

本文介绍了java 读写Parquet格式的数据,分享给大家,具体如下:

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.io.IOException;

import java.util.Random;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import org.apache.log4j.Logger;

import org.apache.parquet.example.data.Group;

import org.apache.parquet.example.data.GroupFactory;

import org.apache.parquet.example.data.simple.SimpleGroupFactory;

import org.apache.parquet.hadoop.ParquetReader;

import org.apache.parquet.hadoop.ParquetReader.Builder;

import org.apache.parquet.hadoop.ParquetWriter;

import org.apache.parquet.hadoop.example.GroupReadSupport;

import org.apache.parquet.hadoop.example.GroupWriteSupport;

import org.apache.parquet.schema.MessageType;

import org.apache.parquet.schema.MessageTypeParser;

public class ReadParquet {

static Logger logger=Logger.getLogger(ReadParquet.class);

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

// parquetWriter("test\\parquet-out2","input.txt");

parquetReaderV2("test\\parquet-out2");

}

static void parquetReaderV2(String inPath) throws Exception{

GroupReadSupport readSupport = new GroupReadSupport();

Builder reader= ParquetReader.builder(readSupport, new Path(inPath));

ParquetReader build=reader.build();

Group line=null;

while((line=build.read())!=null){

Group time= line.getGroup("time", 0);

//通过下标和字段名称都可以获取

/*System.out.println(line.getString(0, 0)+"\t"+

line.getString(1, 0)+"\t"+

time.getInteger(0, 0)+"\t"+

time.getString(1, 0)+"\t");*/

System.out.println(line.getString("city", 0)+"\t"+

line.getString("ip", 0)+"\t"+

time.getInteger("ttl", 0)+"\t"+

time.getString("ttl2", 0)+"\t");

//System.out.println(line.toString());

}

System.out.println("读取结束");

}

//新版本中new ParquetReader()所有构造方法好像都弃用了,用上面的builder去构造对象

static void parquetReader(String inPath) throws Exception{

GroupReadSupport readSupport = new GroupReadSupport();

ParquetReader reader = new ParquetReader(new Path(inPath),readSupport);

Group line=null;

while((line=reader.read())!=null){

System.out.println(line.toString());

}

System.out.println("读取结束");

}

/**

*

* @param outPath  输出Parquet格式

* @param inPath 输入普通文本文件

* @throws IOException

*/

static void parquetWriter(String outPath,String inPath) throws IOException{

MessageType schema = MessageTypeParser.parseMessageType("message Pair {\n" +

" required binary city (UTF8);\n" +

" required binary ip (UTF8);\n" +

" repeated group time {\n"+

" required int32 ttl;\n"+

" required binary ttl2;\n"+

"}\n"+

"}");

GroupFactory factory = new SimpleGroupFactory(schema);

Path path = new Path(outPath);

Configuration configuration = new Configuration();

GroupWriteSupport writeSupport = new GroupWriteSupport();

writeSupport.setSchema(schema,configuration);

ParquetWriter writer = new ParquetWriter(path,configuration,writeSupport);

//把本地文件读取进去,用来生成parquet格式文件

BufferedReader br =new BufferedReader(new FileReader(new File(inPath)));

String line="";

Random r=new Random();

while((line=br.readLine())!=null){

String[] strs=line.split("\\s+");

if(strs.length==2) {

Group group = factory.newGroup()

.append("city",strs[0])

.append("ip",strs[1]);

Group tmpG =group.addGroup("time");

tmpG.append("ttl", r.nextInt(9)+1);

tmpG.append("ttl2", r.nextInt(9)+"_a");

writer.write(group);

}

}

System.out.println("write end");

writer.close();

}

}

说下schema(写Parquet格式数据需要schema,读取的话"自动识别"了schema)

/*

* 每一个字段有三个属性:重复数、数据类型和字段名,重复数可以是以下三种:

* required(出现1次)

* repeated(出现0次或多次)

* optional(出现0次或1次)

* 每一个字段的数据类型可以分成两种:

* group(复杂类型)

* primitive(基本类型)

* 数据类型有

* INT64, INT32, BOOLEAN, BINARY, FLOAT, DOUBLE, INT96, FIXED_LEN_BYTE_ARRAY

*/

这个repeated和required 不光是次数上的区别,序列化后生成的数据类型也不同,比如repeqted修饰 ttl2 打印出来为 WrappedArray([7,7_a]) 而 required修饰 ttl2 打印出来为 [7,7_a]  除了用MessageTypeParser.parseMessageType类生成MessageType 还可以用下面方法

(注意这里有个坑--spark里会有这个问题--ttl2这里 as(OriginalType.UTF8) 和 required binary city (UTF8)作用一样,加上UTF8,在读取的时候可以转为StringType,不加的话会报错 [B cannot be cast to java.lang.String )

/*MessageType schema = MessageTypeParser.parseMessageType("message Pair {\n" +

" required binary city (UTF8);\n" +

" required binary ip (UTF8);\n" +

"repeated group time {\n"+

"required int32 ttl;\n"+

"required binary ttl2;\n"+

"}\n"+

"}");*/

//import org.apache.parquet.schema.Types;

MessageType schema = Types.buildMessage()

.required(PrimitiveTypeName.BINARY).as(OriginalType.UTF8).named("city")

.required(PrimitiveTypeName.BINARY).as(OriginalType.UTF8).named("ip")

.repeatedGroup().required(PrimitiveTypeName.INT32).named("ttl")

.required(PrimitiveTypeName.BINARY).as(OriginalType.UTF8).named("ttl2")

.named("time")

.named("Pair");

解决 [B cannot be cast to java.lang.String 异常:

1.要么生成parquet文件的时候加个UTF8

2.要么读取的时候再提供一个同样的schema类指定该字段类型,比如下面:

maven依赖(我用的1.7)

org.apache.parquet

parquet-hadoop

1.7.0

读取parquet_Java读写Parquet格式的数据的方法相关推荐

  1. python 读取geotiff_科学网—利用python GDAL库读写geotiff格式的遥感影像方法 - 张伟的博文...

    (1)利用python GDAL库读写geotiff格式的遥感影像方法,具有很好的参考价值,不错! from osgeo import gdal import numpy as np def read ...

  2. python读取tiff影像_科学网—利用python GDAL库读写geotiff格式的遥感影像方法 - 张伟的博文...

    (1)利用python GDAL库读写geotiff格式的遥感影像方法,具有很好的参考价值,不错! from osgeo import gdal import numpy as np def read ...

  3. php连接数据库返回数据类型,php从数据库读取数据,并以json格式返回数据的方法...

    php中,从数据库读取数据,并以json格式返回数据.具体方法如下: 第一步,定义相关变量 $servername = "localhost"; $username = " ...

  4. python处理文本格式_python linecache 处理固定格式文本数据的方法

    小程序大功能 对一批报文要处理要处理里面的得分,发现python linecache ,特记录如下. #!/usr/bin/env python # -*- coding: utf-8 -*- ''' ...

  5. sas 读取mysql数据类型_SAS | 格式规范数据读取

    1 导入数据的方法 将数据导入SAS的方法有很多,但可以归纳为四个基本类别,其中方法2.3是需要掌握的重点. 直接将数据输入SAS数据集 通过VIEWTABLE窗口(打开方式:工具 → 表编辑器),以 ...

  6. django返回json格式的数据的方法

    需求问题描述: 在使用ajax时,回调函数需要接受多个参数,查询资料,得知使用json格式的数据比较好(当然也可以使用xml).由于项目使用的是django,这就牵扯到django后端如何传输json ...

  7. Spark读取Parquet格式的数据为Dataframe

    SaveMode指定文件保存时的模式: OverWrite 覆盖 Append 追加 ErrorIfExists 如果存在就报错 Ignore 如果存在就忽略 val spark = SparkSes ...

  8. 小程序读取几种不同格式json数据(小程序json解析)

    小程序json解析第一种格式 that.setData({goldData: res.data.result[0], //result里多了个{}所以要标个[0]}) wxml <text cl ...

  9. c# hdf5 写string_C#读取风云卫星(HDF5格式)遥感数据的部分代码

    /// &ltsummary&gt /// 得到double类型的数据集 /// &lt/summary&gt /// &ltparam name=" ...

最新文章

  1. 戚薇在冰箱放香水,是贫穷限制了想象力!
  2. iOS 改变字符串中数字的颜色
  3. 遗传算法(GA)中的编码方式-二进制编码、格雷编码、实数编码
  4. no Bloomberg, wind, ceic, csmar at cambridge
  5. POJ3020深度解析(二分图--最小路径覆盖)
  6. 问题描述 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底
  7. python3.12答案_编程常见问题
  8. 关于MongoDB数据库的可连接性稳定性 - 抛转篇
  9. Android NIO(Noblocking I/O非阻塞I/O)小结
  10. atitit.产品console 日志的aticonsole 方案处理总结
  11. teigha开发从入门到精通(3)-- 编译drawings sdk示例
  12. moodle 中文文件名无法打开和下载问题
  13. (附源码)计算机毕业设计ssm大学生网络安全题库系统
  14. 六篇经典分割算法汇总
  15. 视频盒子项目遇到的问题
  16. Android之头像图片变圆形
  17. Ubuntu / Windows 查看域名系统 (Domain Name System,DNS)
  18. android studio 设备调试及Logcat查看
  19. ARM体系结构2:汇编指令集
  20. Windows 7-11/Server 三蛋多合一精简优化Windows系统

热门文章

  1. C语言I———博客作业04
  2. Ubuntu上搭建网站【建立数据隧道,降低开支】
  3. 【ffmpeg】ffmpeg+SDL实现播放器
  4. 学历:门槛还是机会?
  5. css 绝对定位元素挡住下方元素点击解决办法
  6. 怎么从iPod里导出歌曲文件?
  7. spark union 会引起shuffle吗_面肌痉挛会引起肌肉萎缩吗
  8. 我的野蛮女友(中国版) -- 摘自笑话天空
  9. SQL中三种插入数据的语句
  10. Object-c 开源类库