第64课:Spark SQL下Parquet的数据切分和压缩内幕详解

175 篇文章 3 订阅
33 篇文章 0 订阅

内容:

    1.SparkSQL下的Parquet数据切分
    2.SparkSQL下的Parquet数据压缩

一、SparkSQL下的Parquet数据切分

    Table partitioning (表分区)是在像 Hive 这样的系统中使用的常见的优化方法. 在 partitioned table (分区表)中, 数据通常存储在不同的目录中, partitioning column values encoded (分区列值编码)在每个 partition directory (分区目录)的路径中. Parquet data source (Parquet 数据源)现在可以自动 discover (发现)和 infer (推断)分区信息. 例如, 我们可以使用以下 directory structure (目录结构)将所有以前使用的 population data (人口数据)存储到 partitioned table (分区表)中, 其中有两个额外的列 gender 和 country 作为 partitioning columns (分区列):

    path
    └── to
        └── table
            ├── gender=male
            │   ├── ...
            │   │
            │   ├── country=US
            │   │   └── data.parquet
            │   ├── country=CN
            │   │   └── data.parquet
            │   └── ...
            └── gender=female
                ├── ...
                │
                ├── country=US
                │   └── data.parquet
                ├── country=CN
                │   └── data.parquet
                └── ...
    通过将 path/to/table 传递给 SparkSession.read.parquet 或 SparkSession.read.load , Spark SQL 将自动从路径中提取 partitioning information (分区信息). 现在返回的 DataFrame 的 schema (模式)变成:

    root
    |-- name: string (nullable = true)
    |-- age: long (nullable = true)
    |-- gender: string (nullable = true)
    |-- country: string (nullable = true)
    请注意, 会自动 inferred (推断) partitioning columns (分区列)的 data types (数据类型).目前, 支持 numeric data types (数字数据类型)和 string type (字符串类型).有些用户可能不想自动推断 partitioning columns (分区列)的数据类型.对于这些用例, automatic type inference (自动类型推断)可以由 spark.sql.sources.partitionColumnTypeInference.enabled 配置, 默认为 true .当禁用 type inference (类型推断)时, string type (字符串类型)将用于 partitioning columns (分区列).

    从 Spark 1.6.0 开始, 默认情况下, partition discovery (分区发现)只能找到给定路径下的 partitions (分区).对于上述示例, 如果用户将 path/to/table/gender=male 传递给 SparkSession.read.parquet 或 SparkSession.read.load , 则 gender 将不被视为 partitioning column (分区列).如果用户需要指定 partition discovery (分区发现)应该开始的基本路径, 则可以在数据源选项中设置 basePath.例如, 当 path/to/table/gender=male 是数据的路径并且用户将 basePath 设置为 path/to/table/, gender 将是一个 partitioning column (分区列).

二、SparkSQL下的Parquet数据压缩

    parquetBlocksize总体上讲是压缩后的大小,Parquet非常耗内存,采用高压缩比率,采用很多Cache。解压后的大小是解压前的5-10倍。BlockSize采用默认256MB。

    private static final Log LOG = Log.getLog(ParquetOutputFormat.class); 
    public static final String BLOCK_SIZE = “parquet.block.size”; 
    public static final String PAGE_SIZE = “parquet.page.size”; 
    public static final String COMPRESSION = “parquet.compression”; 
    public static final String WRITE_SUPPORT_CLASS = “parquet.write.support.class”; 
    public static final String DICTIONARY_PAGE_SIZE = “parquet.dictionary.page.size”; 
    public static final String ENABLE_DICTIONARY = “parquet.enable.dictionary”; 
    public static final String VALIDATION = “parquet.validation”; 
    public static final String WRITER_VERSION = “parquet.writer.version”; 
    public static final String ENABLE_JOB_SUMMARY = “parquet.enable.summary-metadata”; 
    public static final String MEMORY_POOL_RATIO = “parquet.memory.pool.ratio”; 
    public static final String MIN_MEMORY_ALLOCATION = “parquet.memory.min.chunk.size”;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值