教程:如何使用Data Lake Analytics创建分区表

简介: # 前言 [Data Lake Analytics ](https://www.aliyun.com/product/datalakeanalytics)(后文简称DLA)提供了无服务化的大数据分析服务,帮助用户通过标准的SQL语句直接对存储在OSS、TableStore上的数据进行查询分析。

教程:如何使用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命令使其生效,再进行查询。
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
11天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
3311 10
|
3天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
1681 5
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
14天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
3353 24
|
7天前
|
人工智能 Linux BI
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
JeecgBoot AI专题研究 一键脚本:Claude Code + JeecgBoot Skills + DeepSeek 全平台接入 一行命令装好 Claude Code + JeecgBoot Skills + DeepSeek 接入,无需翻墙使用 Claude Code,支持 Wind
2403 4
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
|
26天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23602 15
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
5天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全+三种模式+记忆体系+实战工作流完整手册
Claude Code 是当前最流行的终端级 AI 编程助手,能够直接在命令行中完成代码生成、项目理解、文件修改、命令执行、错误修复等全流程开发工作。它不依赖图形界面、不占用额外资源,却能深度理解项目结构,自动生成规范代码,大幅提升研发效率。
963 2

热门文章

最新文章