强制数据分布与导出prefix - 阿里云pg, hdb pg oss快速数据规整外部表导出实践案例

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

标签

PostgreSQL , 阿里云 , RDS PG , HDB PG


背景

批量数据导出在数据分析、数据圈选、广告系统、数据清洗系统、数据规整系统中是一个比较常见的需求,例如:

1、导出任务流。

2、广告系统,圈选人群。

3、数据清洗并导出。

4、数据按某些规则分类,规整并输出到不同的文件。

通常数据库的导出功能相对来说比较单一,例如可以导出query的结果,导出表,导出SCHEMA,导出整个库等。

导出的格式包括CSV,STDOUT等。

但是一个QUERY如果要导出到多个文件(例如前面提到的数据规整需求),目前数据库是没有这样的功能的,需要程序开发。

阿里云RDS PostgreSQL和HDB PostgreSQL提供了这样的导出功能,可以将数据按一定的规则快速的导出到OSS(定义文件的PREFIX,导出的格式等)。

数据按某些规则分类,规整并输出到不同的文件

将数据按某些(字段或虚拟列)内容的不同,写入不同的文件。

这些字段或虚拟列,可以输出到文件,也可以不输出到文件(通过参数调整)。

目前不支持写文件头(列的描述),后面可以加这个功能。或者用户可以在文件最前面加一行,比如用sed或其他编辑工具来添加。

HybridDB for PostgreSQL 例子如下:

1、创建源表

create table t_source (host text, key int , data text);   

2、写入一些测试数据

insert into t_source values('host1',1,'1');   
insert into t_source values('host1',1,'2');   
insert into t_source values('host1',2,'3');   
insert into t_source values('host2',1,'4');   
insert into t_source values('host3',1,'5');   
insert into t_source values('host4',1,'6');   
insert into t_source values('host5',1,'7');   

3、创建目标表(通用型)

file_name_generator_col,指定这列的内容,作为输出OSS文件的PREFIX。不同的值,输出到不同的文件中。

output_generator_col,指是否将file_name_generator_col列输出到OSS中。false表示不输出。

create WRITABLE external table cdn_demo_output   
(   
  prefix text,  -- 这个列作为分布键、也作为输出文件的PREFIX,同时可以通过output_generator_col参数控制是否将这个列输出到OSS文件中。   
  Data json   
)   
location('@@oss_host@@   
        dir=cdn_demo_20170824/ id=@@oss_id@@   
        key= @@oss_key@@ bucket=@@oss_bucket@@ output_generator_col=false file_name_generator_col=prefix') FORMAT 'csv'    
DISTRIBUTED BY (prefix);   

4、创建导出的日志表(元数据表)

create table tbl_output_struct(   
  id int primary key,   -- PK   
  prefix text, -- 前缀   
  struct json, -- 这个前缀对应的,JSON的结构   
  osspath text -- 这个前缀对应的OSS的路径(bucket)。   
);   

5、导出到OSS

由于HybridDB for PostgreSQL是分布式数据库,OSS表选择了根据prefix做分布键,所以分布键有几个,就有机会最多往几个SEGMENT去分发,并行写OSS。如果只有一个prefix值,那么就只会分发到一个SEGMENT写OSS。

用户可以根据需要,选择几个PREFIX,当然PREFIX还可以在分词prefix1和prefix2组成的联合prefix。

例如:

国家||'_'||省份     
这个相当于两个字段联合的prefix。   
   
   
taskid||'_'||(random()*9)::int::text   
从而每个taskid可以拆成10个prefix2,相当于一个taskid开了10个并行写。   
(当没有第二个字段时,使用这种手段效果一样可以多个节点并行)   

导出:

begin;   
   
-- 记录下此次导出的结构,PREFIX等(若已知)。   
insert into tbl_output_struct values ('label1', '{col:type1, col2:type2, ....}', 'bucket_path');   
-- OR   
insert into tbl_output_struct select host||key, '{col:type1, col2:type2, ....}', 'bucket_path' from t_source group by 1;   
   
-- 打开按prefix导出的参数开关   
set rds_write_oss_file_by_distribution_column=on;   
   
-- 导出到OSS   
insert into cdn_demo_output   
(   
  prefix,   
  Data   
)   
select    
  host_and_key,                       -- prefix驱动键   
  row_to_json(row(host_and_key,data)  -- 将需要导出的内容,封装到JSON中   
from   
(   
select    
  row_number() over (partition by host||key order by host||key) as RN,     -- 强制数据库按PREFIX的顺序排序,这样才能保证prefix写入到对应的文件   
  host||key as host_and_key,     
  data    
  from t_source t1    
) t;   
   
end;   

PS,强制分布的原理:

                                                  QUERY PLAN                                                     
--------------------------------------------------------------------------------------------------------------   
 Gather Motion 48:1  (slice2; segments: 48)  (cost=0.04..0.06 rows=1 width=64)   
   ->  Subquery Scan t  (cost=0.04..0.06 rows=1 width=64)   
         ->  Window  (cost=0.04..0.05 rows=1 width=68)   
               Partition By: host_and_key   
               Order By: host_and_key   
               ->  Sort  (cost=0.04..0.04 rows=1 width=68)   
                     Sort Key: host_and_key   
                     ->  Redistribute Motion 48:48  (slice1; segments: 48)  (cost=0.00..0.03 rows=1 width=68)   
                           Hash Key: host_and_key   
                           ->  Seq Scan on t_source t1  (cost=0.00..0.01 rows=1 width=68)   
 Settings:  enable_bitmapscan=off; enable_seqscan=off; optimizer=off   
 Optimizer status: legacy query optimizer   
(12 rows)   

6、格式转换

导出为JSON格式,如果需要转换为CSV,用户可以将数据从OSS读出之后,写程序转换为CSV格式。

格式的内容在元数据表里面。

OSS将来应该也会提供这样的函数编程接口,对OSS里面的数据进行格式转换。

7、将结果作为OSS外部表

将导出的内容,再提供查询。

由于前面我们设置了output_generator_col=false,所以不输出分布键,那么实际上在OSS文件中,只有一列,所以只读OSS外部表的定义如下

create external table cdn_demo_check   
(   
Data json   
)   
location('@@oss_host@@   
        dir=cdn_demo_20170824/ id=@@oss_id@@   
        key= @@oss_key@@ bucket=@@oss_bucket@@') FORMAT 'csv';   
   
select * from  cdn_demo_check order by data;   

参考

RDS PG OSS 外部表文档:https://help.aliyun.com/knowledge_detail/43352.html

HDB PG OSS 外部表文档:https://help.aliyun.com/document_detail/35457.html

《日增量万亿+级 实时分析、数据规整 - 阿里云HybridDB for PostgreSQL最佳实践》

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
1月前
|
关系型数据库 MySQL 数据挖掘
阿里云 SelectDB 携手 DTS ,一键实现 TP 数据实时入仓
DTS 作为阿里云核心的数据交互引擎,以其高效的实时数据流处理能力和广泛的数据源兼容性,为用户构建了一个安全可靠、可扩展、高可用的数据架构桥梁。阿里云数据库 SelectDB 通过与 DTS 联合,为用户提供了简单、实时、极速且低成本的事务数据分析方案。用户可以通过 DTS 数据传输服务,一键将自建 MySQL / RDS MySQL / PolarDB for MySQL 数据库,迁移或同步至阿里云数据库 SelectDB 的实例中,帮助企业在短时间内完成数据迁移或同步,并即时获得深度洞察。
阿里云 SelectDB 携手 DTS ,一键实现 TP 数据实时入仓
|
1月前
|
Java API 开发工具
如何用阿里云 oss 下载文件
阿里云对象存储服务(OSS)提供了多种方式下载文件,以下讲解下各种方式的下载方法
759 1
|
1月前
|
SQL 分布式计算 关系型数据库
阿里云E-MapReduce Trino专属集群外连引擎及权限控制踩坑实践
本文以云厂商售后技术支持的角度,从客户的需求出发,对于阿里云EMR-Trino集群的选型,外连多引擎的场景、Ldap以及Kerberos鉴权等问题进行了简要的实践和记录,模拟客户已有的业务场景,满足客户需求的同时对过程中的问题点进行解决、记录和分析,包括但不限于Mysql、ODPS、Hive connector的配置,Hive、Delta及Hudi等不同表格式读取的兼容,aws s3、阿里云 oss协议访问异常的解决等。
|
1月前
|
SQL 人工智能 数据挖掘
阿里云DMS,身边的智能化数据分析助手
生成式AI颠覆了人机交互的传统范式,赋予每个人利用AI进行低门槛数据分析的能力。Data Fabric与生成式AI的强强联合,不仅能够实现敏捷数据交付,还有效降低了数据分析门槛,让人人都能数据分析成为可能!阿里云DMS作为阿里云统一的用数平台,在2021年初就开始探索使用Data Fabric理念构建逻辑数仓来加速企业数据价值的交付,2023年推出基于大模型构建的Data Copilot,降低用数门槛,近期我们将Notebook(分析窗口)、逻辑数仓(Data Fabric)、Data Copilot(生成式AI)进行有机组合,端到端的解决用数难题,给用户带来全新的分析体验。
110091 118
阿里云DMS,身边的智能化数据分析助手
|
28天前
|
存储 安全 对象存储
手把手教你搭建阿里云图床(PicGo+Typora+阿里云OSS),新手小白一看就会
本文详细介绍了怎样帮助新手小白从注册,购买阿里云OSS,到一步一步配置OSS做为图床,和PicGo、Typora软件连接,配置好关联之后,在使用Typora写文章时,如果需要插入图片,只需要将图片复制粘贴到Typora的编辑区域,就会自动通过PicGo上传到指定图床,自动复制外网能访问的URL并展示,简直不要太方便,极大的解决了编辑文章时复制处理图片链接的痛点。
147 2
手把手教你搭建阿里云图床(PicGo+Typora+阿里云OSS),新手小白一看就会
|
2月前
|
存储 数据可视化 数据管理
基于阿里云服务的数据平台架构实践
本文主要介绍基于阿里云大数据组件服务,对企业进行大数据平台建设的架构实践。
703 0
|
1月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
|
22天前
|
SQL 存储 API
阿里云实时计算Flink的产品化思考与实践【下】
本文整理自阿里云高级产品专家黄鹏程和阿里云技术专家陈婧敏在 FFA 2023 平台建设专场中的分享。
110419 10
阿里云实时计算Flink的产品化思考与实践【下】
|
4天前
|
存储 Java API
阿里云oss简介和使用流程
本文档介绍了如何准备阿里云OSS(对象存储服务)并开始使用它。首先,需要注册阿里云账号并进行实名认证,然后购买OSS资源包。在阿里云控制台中,可以创建和管理OSS存储空间(称为“Bucket”)。接着,文章简要介绍了阿里云OSS,它是一个基于云端的对象存储服务,提供高可靠性、高性能、低成本和易于使用的特性。 在阿里云OSS控制台,用户可以进行文件的上传和下载操作。通过API,开发者可以使用各种编程语言(如Java)来创建、删除Bucket以及上传、下载和删除文件。例如,Java代码示例展示了如何创建Bucket、上传文件、删除文件以及下载文件到本地的操作。
|
11天前
|
开发工具 对象存储
阿里云OSS文件上传
阿里云OSS文件上传
53 0