Apache Parquet ----大数据通用列式存储文件

 

     新项目中引进Dremio作为计算引擎,做了一些研究和开发。记录下。

首先简单介绍下

一.Dremio架构

Dremio是基于Apache calcite、Apache arrow和Apache parquet3个开源框架构建,结构其核心引擎Sabot,形成这款DaaS(Data-as-a-Service)数据即服务平台;整体体验风格与其公司开源的Apache Drill非常接近。

Ⅰ).架构图

 

这里涉及技术比较多,我们今天先介绍下 Apache parquet文件。

二.Apache Parquet

Apache Parquet是一种面向分析的、通用的列式存储格式,兼容各种数据处理框架比如 Spark、Hive、Impala 等,同时支持 Avro、Thrift、Protocol Buffers 等数据模型。

 

Parquet文件结构

  1. File一个 Parquet 文件,包括数据和元数据
  2. Row group数据在水平方向上按行拆分为的单元
  3. Column一个行组中的每一列对应的保存在一个列块中
  4. Page每一个列块划分为多个数据页,同一个列块的不同页可能使用不同的编码格式

元数据

元数据包括如下3部分

  1. file metadata
  2. column (chunk) metadata
  3. page header metadata

在引入Dremio前,我们使用MaxCompute作为计算引擎,使用Datax做数据采集。还是决定使用Datax做为采集工具,但是Datax本身并没有支持parquet读和写的插件,需要自己开发。

 

如何生成parquet文件?

1.指定schema

2.写入记录

大致代码如下

    void write(RecordReceiver recordReceiver) throws IOException {
        Record lineRecord;

        while ((lineRecord = recordReceiver.getFromReader()) != null) {


            if (lineRecord.getColumnNumber() != this.columnNumber) {
                // 源头读取字段列数与目的表字段写入列数不相等,直接报错
                throw DataXException
                        .asDataXException(
                                S3ParquetWriterErrorCode.CONFIG_INVALID_EXCEPTION,
                                String.format(
                                        "列配置信息有错误. 因为您配置的任务中,源头读取字段数:%s 与 目的表要写入的字段数:%s 不相等. 请检查您的配置并作出修改.",
                                        lineRecord.getColumnNumber(),
                                        this.columnNumber));
            }

            GenericData.Record recordNew = new GenericData.Record(avroSchema);

            setKeyValue(recordNew, this.schema, lineRecord);

            writer.write(recordNew);
        }
        this.s3ParquetOutputFile.s3out.setCommit();
        this.writer.close();
    }

Parquet 文件为了能够更有效的储存数据,对数据类型尽可能做了最小化的处理。目前 Parquet 包含如下几个类型:

  • BOOLEAN: 1 bit boolean
  • INT32: 32 bit signed ints
  • INT64: 64 bit signed ints
  • INT96: 96 bit signed ints
  • FLOAT: IEEE 32-bit floating point values
  • DOUBLE: IEEE 64-bit floating point values
  • BYTE_ARRAY: 任意长度 byte 数组

 

其中schema的类型支持。https://avro.apache.org/docs/current/spec.html#Date

参考:

https://developer.aliyun.com/article/715004

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值