• 如何使用Data Lake Analytics创建分区表


    前言

    Data Lake Analytics (后文简称DLA)提供了无服务化的大数据分析服务,帮助用户通过标准的SQL语句直接对存储在OSS、TableStore上的数据进行查询分析。

    在关系型数据库中,用户可以对大数据量的表进行分区,提高查询的性能。同样在DLA中,用户可以使用分区表将数据进行细化,达到缩短查询响应时间的目的。

    本文将以OSS数据源为例,详细介绍如何在DLA中创建和使用分区表。

    创建分区表

    在DLA中,创建一张分区表需要在建表语句中指定 PARTITIONED BY, 例如
    创建一张名为tbl3_part的分区表,该表有两个分区列,分别为p和q。

    CREATE EXTERNAL TABLE tbl3_part 
    (foo int, bar string)
    PARTITIONED BY (p string, q string)
    STORED AS TEXTFILE
    LOCATION 'oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3/';
    

    分区表在OSS上的目录结构

    DLA可以将存储在OSS上的目录或文件映射成一张表。表中的数据就是OSS中的文件内容。

    对于分区表来说,分区列对应OSS上的目录,而且是有特殊命名规则的目录:

    1. 分区列对应表的LOCATION下的一个子目录,目录的命名规则为 分区列名=分区值
    2. 如果有多个分区列,则需要按照建表语句中指定的分区列的顺序依次嵌套

    对于上面例子中的建表语句,OSS上的目录结构为:

    $osscmd ls oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3
    prefix list is:
    object list is:
    2018-08-08 14:23:17 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3/p=3/q=3/kv1.txt
    2018-08-08 18:01:08 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3/p=30/q=30/kv1.txt
    

    使用MSCK命令更新分区信息

    建表成功后,需要执行 MSCK REPAIR TABLE 命令,将分区信息同步到DLA中。

    MSCK REPAIR TABLE tbl3_part;
    

    执行MSCK成功后,通过 SHOW PARTITIONS 语句可以看到表中所有的分区信息。

    mysql> show partitions tbl3_part;
    +-----------+
    | Result    |
    +-----------+
    | p=3/q=3   |
    | p=30/q=30 |
    +-----------+
    

    MSCK只能识别符合DLA分区列命名规则的目录,即分区列的目录名为 分区列名=分区列值。
    因此,当OSS上的分区目录发上变化时,执行MSCK命令,DLA可以根据OSS中当前分区值信息自动同步。

    使用ALTER命令添加/删除分区

    对于已经存在的但是不满足DLA分区列命名规则的目录,用户可以通过 ALTER命令更新表的分区信息。

    添加分区

    语法:

    ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];
    
    partition_spec:
      : (partition_column = partition_col_value, partition_column = partition_col_value, ...)
    

    可以一次指定添加多个分区,分区之间用逗号分隔。
    示例,

    ALTER TABLE order_part ADD 
        PARTITION (dt='2008-08-08', status='ready') location '/path/to/ready/part080808',
        PARTITION (dt='2008-08-09', status='new') location '/path/to/new/part080809';
    

    对于上面的语句,

    1. 如果新增的分区已经存在,则执行失败,报错 "Partition already exists";
    2. 如果使用了 [IF NOT EXISTS], 当新增分区已存在时,执行不会报错,新的LOCATION会覆盖掉原有分区所指向的目录;

    删除分区

    语法:

    ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...];
    

    可以一次指定删除多个分区,分区之间用逗号分隔。
    示例,

    ALTER TABLE order_part DROP
        PARTITION (dt='2008-08-08', status='ready');
    

    对于上面的语句,

    1. 如果删除的分区不存在,执行不会报错;
    2. 如果使用了 [IF EXISTS], 当删除分区不存在时,执行不会报错;
    3. DROP 分区目前只支持 "分区列=分区值" 的指定方式。不支持分区值是一个表达式,比如 partitionCol > 100;
    4. 如果删除的分区目录名符合 分区列名=分区列值 的命名规则,执行MSCK命令仍会将已经删除的分区自动添加。

    分区表查询

    全表查询时,得到的是所有分区下的数据。

    mysql> select count(*) from tbl3_part;
    +-------+
    | _col0 |
    +-------+
    |  1000 |
    +-------+
    

    当执行 SELECT * 时,可以发现分区列将以列的形式出现在表中定义的数据列的后面。

    mysql> select * from tbl3_part limit 3;
    +------+---------+------+------+
    | foo  | bar     | p    | q    |
    +------+---------+------+------+
    |  238 | val_238 | 3    | 3    |
    |   86 | val_86  | 3    | 3    |
    |  311 | val_311 | 3    | 3    |
    +------+---------+------+------+
    

    查询时可以使用分区列做filter

    mysql> select count(*) from tbl3_part where p='3';
    +-------+
    | _col0 |
    +-------+
    |   500 |
    +-------+
    

    注意事项

    1. OSS上分区列的目录结构的嵌套顺序需要与表中定义的顺序一致
      比如 对于本文例子中的目录结构,下面的建表语句是错误的
    CREATE EXTERNAL TABLE tbl3_part 
    (col1 int, col2 string)
    PARTITIONED BY (q string, p string)
    STORED AS TEXTFILE
    LOCATION 'oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table3/';
    
    1. 分区表只会扫描分区列所在目录下的数据.
      对于下面的目录结构
    $osscmd ls oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table4/
    prefix list is:
    object list is:
    2018-08-08 14:23:56 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table4/kv1.txt
    2018-08-08 14:23:48 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table4/p=4/kv2.txt
    2018-08-08 14:23:40 5.68KB Standard oss://oss-jinluo-openanalytics-test/datasets/test/test_partition/table4/p=4/q=4/kv3.txt
    

    如果建表语句中指定的分区列为 p 和 q,则该表的数据文件只有 kv3.txt.
    数据文件 kv1.txt 和 kv2.txt 将不会被计算在内。

    1. 如果有新增的OSS分区目录,则需要手动执行 MSCK REPAIR TABLE table_name 命令或者ALTER ADD PARTITION命令使其生效,再进行查询。


    本文作者:金络

    原文链接

    本文为云栖社区原创内容,未经允许不得转载。

  • 相关阅读:
    MV*模式的个人理解
    Unlink of file '.git/objects/pack/pack-***.pack' failed. Should I try again? (y/n) (转)
    不定宽高元素的水平垂直居中
    判断是否在微信浏览器中
    HTML5实战与剖析之触摸事件(touchstart、touchmove和touchend)(转)
    清除inline-block元素间距
    rs485多主
    基于状态机的单片机按键短按长按功能的实现
    深入理解FIFO(包含有FIFO深度的解释)——转载
    传递指针的指针(错误的例子)
  • 原文地址:https://www.cnblogs.com/zhaowei121/p/10622666.html
Copyright © 2020-2023  润新知