java 读写Parquet格式的数据 Parquet example
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<Group> reader= ParquetReader.builder(readSupport, new Path(inPath));
ParquetReader<Group> 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<Group> reader = new ParquetReader<Group>(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<Group> writer = new ParquetWriter<Group>(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类指定该字段类型,比如下面:

hadoop Mapreducer读写 Parquetexample
http://www.cnblogs.com/yanghaolie/p/7389543.html
maven依赖(我用的1.7)
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-hadoop</artifactId>
<version>1.7.0</version>
</dependency>
java 读写Parquet格式的数据 Parquet example的更多相关文章
- Android读写JSON格式的数据之JsonWriter和JsonReader
		
近期的好几个月都没有搞Android编程了,逐渐的都忘却了一些东西.近期打算找一份Android的工作,要继续拾起曾经的东西.公司月初搬家之后就一直没有网络,直到今日公司才有网络接入,各部门才開始办公 ...
 - pandas(六)读写文本格式的数据
		
pandas提供的将表格型数据读取为DataFrame对象的函数. 函数 说明 read_csv 从文件.URL.文件型对象中加载带分隔符的数据.默认分隔符为逗号. read_table 从文件.UR ...
 - JAVA 读取xml格式的数据
		
<?xml version="1.0" encoding="UTF-8"?> <column-enums> <type name= ...
 - pandas 读写 Excel 格式的数据
		
import pandas as pd #读入数据: df = pd.read_excel('data_in.xlsx') #导出数据: writer = pd.ExcelWriter('data_o ...
 - java 返回json格式的数据
		
1 阿里巴巴的fastjson import com.alibaba.fastjson.JSON; 使用的时候 JSON.toJSON(list); 2 Gson 解析json数据 import c ...
 - learning java 读写其他进程的数据
		
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...
 - mapreduce 读写Parquet格式数据 Demo
		
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs ...
 - Hive 导入 parquet 格式数据
		
Hive 导入 parquet 数据步骤如下: 查看 parquet 文件的格式 构造建表语句 倒入数据 一.查看 parquet 内容和结构 下载地址 社区工具 GitHub 地址 命令 查看结构: ...
 - 大数据学习day25------spark08-----1. 读取数据库的形式创建DataFrame  2. Parquet格式的数据源 3. Orc格式的数据源 4.spark_sql整合hive 5.在IDEA中编写spark程序(用来操作hive)  6. SQL风格和DSL风格以及RDD的形式计算连续登陆三天的用户
		
1. 读取数据库的形式创建DataFrame DataFrameFromJDBC object DataFrameFromJDBC { def main(args: Array[String]): U ...
 
随机推荐
- @JsonView的使用
			
1.使用场景 在某一些请求返回的JSON中,我们并不希望返回某些字段.而在另一些请求中需要返回某些字段. 例如: 在查询列表请求中,不返回password字段 在获取用户详情中,返回password字 ...
 - SpringBoot第十七篇:定时任务
			
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11076555.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 相信大家对 ...
 - Axios构造函数学习笔记
			
Axios 构造函数 lib/core/axios.js ... var intercaptorManager = require(./IntercaptorManger); var dispatch ...
 - MySQL 快速添加百万条数据
			
需要向数据库添加100W条测试数据,直接在普通表中添加速度太慢,可以使用内存表添加,然后将内存表数据复制到普通表 创建表 # 内存表 DROP TABLE IF EXISTS `test_memory ...
 - 局域网Linux机器中病毒简单处理 .aliyun.sh 挖矿病毒 ---不彻底
			
1. 昨天晚上同事打电话给我说自己的服务器上面的redis无故被清空了,并且查看aof 日志有很多 wget和write指令 一想就是大事不好.局域网中病毒了.. 2. 今天早上到公司忙完一阵简单看了 ...
 - Linux进程启动/指令执行方式研究
			
1. 通过glibc api执行系统指令 0x1:system() glibc api system是linux系统提供的函数调用之一,glibc也提供了对应的封装api. system函数的原型为: ...
 - leetcode不同路径
			
62. 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 问 ...
 - Jenkins的使用(二)-------MSBuild
			
六.构建 左边菜单栏 Manage Jenkins --->ManagePlugins--->可选插件,然后搜索 MSBuild,并安装 添加ssh插件后新增了两种 1.使用MSBu ...
 - HTML CSS布局定位
			
我们在编写网页代码时,首先应该做的就是设计好页面的布局形式,然后再往里面填充内容.网页布局的好与坏,直接决定了网页最终的展示效果.PC端常见的网页布局形式有两列布局.三列布局等.在CSS中,我们通常使 ...
 - linux系统下使用nginx反向代理asp.net core,并配置免费的https证书
			
反向代理是为动态 Web 应用提供服务的常见设置. 反向代理终止 HTTP 请求,并将其转发到 ASP.NET Core 应用. 1.在asp.net core项目中的Startup的Configur ...