如何使用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上的目录,而且是有特殊命名规则的目录:
- 分区列对应表的LOCATION下的一个子目录,目录的命名规则为 分区列名=分区值
- 如果有多个分区列,则需要按照建表语句中指定的分区列的顺序依次嵌套
对于上面例子中的建表语句,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';
对于上面的语句,
- 如果新增的分区已经存在,则执行失败,报错 "Partition already exists";
- 如果使用了 [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');
对于上面的语句,
- 如果删除的分区不存在,执行不会报错;
- 如果使用了 [IF EXISTS], 当删除分区不存在时,执行不会报错;
- DROP 分区目前只支持 "分区列=分区值" 的指定方式。不支持分区值是一个表达式,比如 partitionCol > 100;
- 如果删除的分区目录名符合 分区列名=分区列值 的命名规则,执行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 |
+-------+
注意事项
- 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/';
- 分区表只会扫描分区列所在目录下的数据.
对于下面的目录结构
$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 将不会被计算在内。
- 如果有新增的OSS分区目录,则需要手动执行 MSCK REPAIR TABLE table_name 命令或者ALTER ADD PARTITION命令使其生效,再进行查询。
本文作者:金络
本文为云栖社区原创内容,未经允许不得转载。
如何使用Data Lake Analytics创建分区表的更多相关文章
- 如何在Data Lake Analytics中使用临时表
前言 Data Lake Analytics (后文简称DLA)是阿里云重磅推出的一款用于大数据分析的产品,可以对存储在OSS,OTS上的数据进行查询分析.相较于传统的数据分析产品,用户无需将数据重新 ...
- 使用Data Lake Analytics从OSS清洗数据到AnalyticDB
前提 必须是同一阿里云region的Data Lake Analytics(DLA)到AnalyticDB的才能进行清洗操作: 开通并初始化了该region的DLA服务: 开通并购买了Analytic ...
- Data Lake Analytics: 读/写PolarDB的数据
Data Lake Analytics 作为云上数据处理的枢纽,最近加入了对于PolarDB的支持, PolarDB 是阿里云自研的下一代关系型分布式云原生数据库,100%兼容MySQL,存储容量最高 ...
- Data Lake Analytics,大数据的ETL神器!
0. Data Lake Analytics(简称DLA)介绍 数据湖(Data Lake)是时下大数据行业热门的概念:https://en.wikipedia.org/wiki/Data_lake. ...
- Data Lake Analytics: 使用DataWorks来调度DLA任务
DataWorks作为阿里云上广受欢迎的大数据开发调度服务,最近加入了对于Data Lake Analytics的支持,意味着所有Data Lake Analytics的客户可以获得任务开发.任务依赖 ...
- 使用Data Lake Analytics + OSS分析CSV格式的TPC-H数据集
0. Data Lake Analytics(DLA)简介 关于Data Lake的概念,更多阅读可以参考:https://en.wikipedia.org/wiki/Data_lake 以及AWS和 ...
- Data Lake Analytics账号和权限体系详细介绍
一.Data Lake Analytics介绍 数据湖(Data Lake)是时下大数据行业热门的概念:https://en.wikipedia.org/wiki/Data_lake.基于数据湖做分析 ...
- 使用Data Lake Analytics读/写RDS数据
Data Lake Analytics 作为云上数据处理的枢纽,最近加入了对于RDS(目前支持 MySQL , SQLServer ,Postgres 引擎)的支持, 这篇教程带你玩转 DLA 的 R ...
- Data Lake Analytics中OSS LOCATION的使用说明
前言 Data Lake Analytic(后文简称 DLA)可以帮助用户通过标准的SQL语句直接对存储在OSS.TableStore上的数据进行查询分析. 在查询前,用户需要根据数据文件的格式和内容 ...
随机推荐
- 第一个WindowService服务
背景:Web项目中需要定时执行一段程序 方法: 1.新建一个WindowService项目 2.添加代码 public partial class Service1 : ServiceBase { S ...
- [编织消息框架][netty源码分析]3 EventLoop 实现类SingleThreadEventLoop职责与实现
eventLoop是基于事件系统机制,主要技术由线程池同队列组成,是由生产/消费者模型设计,那么先搞清楚谁是生产者,消费者内容 SingleThreadEventLoop 实现 public abst ...
- Shell 语法之信号与作业
Linux 使用信号与系统上运行的进程进行通信. Linux 编程中最常见的 Linux 系统信号 信号 值 描述 1 SIGHUP 挂起进程 2 SIGINT 中断进程 3 SIGQU ...
- stack和heap的区别
The difference between stack and heap memory allocation Posted: 11th August 2010 by Tim in C, C++, S ...
- VMWare下载安装以及创建虚拟机教程
参考博客https://blog.csdn.net/qq_39135287/article/details/83993574 下载 1.打开官网https://www.vmware.com/cn.ht ...
- flex 手册摘要
个人学习 摘抄翻译 http://www.cs.princeton.edu/~appel/modern/c/software/flex/flex.html#SEC1 程序的格式 分成显示的三部分 由% ...
- Oracle VM VirtualBox安装增强功能和共享文件夹的方法
一.介绍下如何安装增强功能 1)选择安装增强功能的安装包有2种方法,分别如下: 第一种:找到设备->安装增强功能 第二种 1)找到设备->点击选择虚拟盘. 2)找到VirtualBox-& ...
- hibernate 注释多表 级联操作
一对多模型(单向) 说明: 一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息.客户和地址是一对多的关系,并且客户与地址是单向关联的关系. 映射策略 # 外键关联:两个表的关系定义在一个表中 ...
- <init>与<clinit>的区别
在编译生成class文件时,会自动产生两个方法,一个是类的初始化方法<clinit>, 另一个是实例的初始化方法<init> <clinit>:在jvm第一次加载c ...
- Redis源码解析:13Redis中的事件驱动机制
Redis中,处理网络IO时,采用的是事件驱动机制.但它没有使用libevent或者libev这样的库,而是自己实现了一个非常简单明了的事件驱动库ae_event,主要代码仅仅400行左右. 没有选择 ...