沉浸式学习PostgreSQL|PolarDB 5: 零售连锁、工厂等数字化率较低场景的数据分析

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 零售连锁, 制作业的工厂等场景中, 普遍数字化率较低, 通常存在这些问题:数据离线, 例如每天盘点时上传, 未实现实时汇总到数据库中.数据格式多, 例如excel, csv, txt, 甚至纸质手抄.让我们一起来思考一下, 如何使用较少的投入实现数据汇总分析?

作者

digoal

日期

2023-08-26

标签

PostgreSQL , PolarDB , 数据库 , 教学


背景

欢迎数据库应用开发者参与贡献场景, 在此issue回复即可, 共同建设《沉浸式数据库学习教学素材库》, 帮助开发者用好数据库, 提升开发者职业竞争力, 同时为企业降本提效.

  • 系列课程的核心目标是教大家怎么用好数据库, 而不是怎么运维管理数据库、怎么开发数据库内核. 所以面向的对象是数据库的用户、应用开发者、应用架构师、数据库厂商的产品经理、售前售后专家等角色.

本文的实验可以使用永久免费的阿里云云起实验室来完成.

如果你本地有docker环境也可以把镜像拉到本地来做实验:

x86_64机器使用以下docker image:

ARM机器使用以下docker image:

业务场景1 介绍: 零售连锁、工厂等数字化率较低场景的数据分析

零售连锁, 制作业的工厂等场景中, 普遍数字化率较低, 通常存在这些问题:

  • 数据离线, 例如每天盘点时上传, 未实现实时汇总到数据库中.
  • 数据格式多, 例如excel, csv, txt, 甚至纸质手抄.

让我们一起来思考一下, 如何使用较少的投入实现数据汇总分析?

实现和对照

传统方法 设计和实验

通过统一网点的IT应用, 数据治理实现格式统一.

使用高质量的VPN网络将网点和中心点连接起来, 网点数据实时上传中心数据库.

成本较高.

PolarDB|PG新方法1 设计和实验

1、在不破坏现有使用习惯的情况下, 依旧使用离线采集, 数据格式可以使用门槛较低的excel, csv. 数据上传到OSS. (OSS是对象存储, 存储非常廉价, 内网带宽几乎免费.)

2、使用duckdb_fdw或plpython3u读取oss内的数据文件.

3、使用pg|polardb进行汇总分析.

让我们实验阿里云云起实验来验证上面的设计是否可行, 例子:

1、打开云起实验室, 资源栏, 这个例子要用到oss实验资源.

https://developer.aliyun.com/adc/scenario/exp/f55dbfac77c0467a9d3cd95ff6697a31

得到资源如下:

AK ID      : xxxxxx  
AK Secret     :  xxxxxx 
Endpoint外网域名|内网域名    : s3.oss-cn-shanghai.aliyuncs.com  
bucket   : tekwvr20230826180728

2、使用duckdb生成excel格式的测试数据, 并写入OSS, 模拟连锁店、工厂的边缘端数据采集和上传行为.

进入容器

docker exec -ti pg bash

启动duckdb

su - postgres  
./duckdb

加载连接oss和s3的httpfs插件, 加载解析excel文件的spatial插件:

install httpfs;    
load httpfs;    
install spatial;   
load spatial;

根据云起实验的资源信息来设置oss或s3连接配置:

set s3_access_key_id='xxxxxx';               -- AK ID        
set s3_secret_access_key='xxxxxx';     -- AK Secret        
set s3_endpoint='s3.oss-cn-shanghai.aliyuncs.com';             -- Endpoint外网域名|内网域名

随机生成100万条记录, 并导出到excel文件中. 包含id,c1,info三个字段.

COPY (select id, (random()*10000)::int as c1, md5(random()::text) as info from range(0,1000000) as t(id)) TO '/tmp/t1.XLSX'  
WITH (FORMAT GDAL, DRIVER 'XLSX');

下载ossutil 客户端, 用于下载和上传xlsx文件.

https://help.aliyun.com/zh/oss/developer-reference/upload-objects-6

cd /tmp  
wget https://gosspublic.alicdn.com/ossutil/1.7.16/ossutil-v1.7.16-linux-amd64.zip  
unzip ossutil-v1.7.16-linux-amd64.zip  
chmod -R 555 ossutil-v1.7.16-linux-amd64

配置ossutil工具的oss参数, 根据云起实验的资源信息来设置oss或s3连接配置:

root@cf68c33c8144:/tmp# ./ossutil-v1.7.16-linux-amd64/ossutil64 config  
The command creates a configuration file and stores credentials.  
  
Please enter the config file name,the file name can include path(default /root/.ossutilconfig, carriage return will use the default file. If you specified this option to other file, you should specify --config-file option to the file when you use other commands):  
No config file entered, will use the default config file /root/.ossutilconfig  
  
For the following settings, carriage return means skip the configuration. Please try "help config" to see the meaning of the settings  
Please enter language(CH/EN, default is:EN, the configuration will go into effect after the command successfully executed):  
Please enter accessKeyID:xxxxxx  
Please enter accessKeySecret:xxxxxx  
Please enter stsToken:  
Please enter endpoint:s3.oss-cn-shanghai.aliyuncs.com

将前面生成的excel文件上传到oss对象存储中.

root@cf68c33c8144:/tmp# ./ossutil-v1.7.16-linux-amd64/ossutil64 cp /tmp/t1.XLSX oss://tekwvr20230826180728/  
Succeed: Total num: 1, size: 39,564,235. OK num: 1(upload 1 files).                                         
  
average speed 4742000(byte/s)  
  
8.343042(s) elapsed

同样的, xlsx文件需要下载到本地后再加载进数据库. 模拟下载工厂、零售分店上传到oss的每日数据文件.

root@cf68c33c8144:/tmp# ./ossutil-v1.7.16-linux-amd64/ossutil64 cp oss://tekwvr20230826180728/t1.XLSX /tmp/t1_new.XLSX   
Succeed: Total num: 1, size: 39,564,235. OK num: 1(download 1 objects).  
  
average speed 15147000(byte/s)  
  
2.612532(s) elapsed

在duckdb中可以查询excel文件

SELECT * FROM st_read('/tmp/t1_new.XLSX') limit 10;

2.1、使用duckdb_fdw读取oss的数据(模拟读取连锁店、工厂的边缘端上传到云端oss的数据), 并写入到本地数据库中. 完成数据汇总.

在postgresql|polardb中使用duckdb_fdw, 通过duckdb来读取xlsx(excel)文件内容.

创建插件

create extension duckdb_fdw ;

创建sesrver

CREATE SERVER DuckDB_server FOREIGN DATA WRAPPER duckdb_fdw OPTIONS (database ':memory:');    
alter server duckdb_server options ( keep_connections 'true');

加载读取excel文件的spatial插件

SELECT duckdb_execute('duckdb_server',       
$$      
load spatial;    
$$);

创建视图

SELECT duckdb_execute('duckdb_server',       
$$      
create or replace view v_t1_new as       
SELECT * FROM st_read('/tmp/t1_new.XLSX');      
$$);

将duckdb的视图导入postgresql|polardb

IMPORT FOREIGN SCHEMA public limit to (v_t1_new)  FROM SERVER   
duckdb_server INTO public;

可以在postgresql|polardb读取excel文件了

postgres=# select count(*) from v_t1_new ;  
  count    
---------  
 1000000  
(1 row)

可以将数据加载进入postgresql|polardb

create table local_t1_new as select * from v_t1_new ;  
  
SELECT 1000000  
  
  
postgres=# select count(*) from local_t1_new ;  
  count    
---------  
 1000000  
(1 row)

查看excel和导入到postgresql|polardb中的数据是否一致:

postgres=# select * from v_t1_new limit 10;  
 id | CAST((random() * 10000) AS INTEGER) |               info                 
----+-------------------------------------+----------------------------------  
  0 |                                9379 | 65ca3162135590a9c49eaed527bb0717  
  1 |                                2050 | 83ff8d7aa48ee3fb06439905f07171f8  
  2 |                                 600 | 2e5df489239dc8c715ea5240cb1a5b1b  
  3 |                                7839 | 3ce8ab6d54f2a7c38a075cdcc853c2ae  
  4 |                                 881 | 4cc6d2e410f9b34f06a45b65ddbc055c  
  5 |                                2643 | beeceabdba66d6d5f8f278f8af0dde5a  
  6 |                                3516 | aef3ab5795eeb9b621926c0c04091d44  
  7 |                                 703 | b26a2038ae2b0d0f1355c212742445c7  
  8 |                                9284 | 39271f49ad09da33add4f77adac37403  
  9 |                                4260 | 8f19c05ef83c33fd2a7dc133ee2e0e93  
(10 rows)  
  
postgres=# select * from local_t1_new limit 10;  
 id | CAST((random() * 10000) AS INTEGER) |               info                 
----+-------------------------------------+----------------------------------  
  0 |                                9379 | 65ca3162135590a9c49eaed527bb0717  
  1 |                                2050 | 83ff8d7aa48ee3fb06439905f07171f8  
  2 |                                 600 | 2e5df489239dc8c715ea5240cb1a5b1b  
  3 |                                7839 | 3ce8ab6d54f2a7c38a075cdcc853c2ae  
  4 |                                 881 | 4cc6d2e410f9b34f06a45b65ddbc055c  
  5 |                                2643 | beeceabdba66d6d5f8f278f8af0dde5a  
  6 |                                3516 | aef3ab5795eeb9b621926c0c04091d44  
  7 |                                 703 | b26a2038ae2b0d0f1355c212742445c7  
  8 |                                9284 | 39271f49ad09da33add4f77adac37403  
  9 |                                4260 | 8f19c05ef83c33fd2a7dc133ee2e0e93  
(10 rows)

3、使用duckdb生成csv格式的测试数据, 并写入OSS, 模拟连锁店、工厂的边缘端数据采集和上传行为.

随机生成100万条记录, 并导出到oss的csv文件中. 包含id,c1,info,ts 四个字段.

COPY (select id, (random()*10000)::int c1, md5(random()::text) as info, now() as ts from range(0,1000000) as t(id)) TO 's3://tekwvr20230826180728/t2.csv'  
WITH (HEADER, DELIMITER ',');

3.1、使用duckdb_fdw读取oss的数据(模拟读取连锁店、工厂的边缘端上传到云端oss的数据), 并写入到本地数据库中. 完成数据汇总.

创建插件

create extension duckdb_fdw ;

创建sesrver

CREATE SERVER DuckDB_server FOREIGN DATA WRAPPER duckdb_fdw OPTIONS (database ':memory:');    
alter server duckdb_server options ( keep_connections 'true');

加载读取oss文件的httpfs插件

SELECT duckdb_execute('duckdb_server',       
$$      
load httpfs;    
$$);

设置当前duckdb fdw对应的连接oss的配置

SELECT duckdb_execute('duckdb_server',       
$$      
set s3_access_key_id='xxxxxx';       
$$);      
      
SELECT duckdb_execute('duckdb_server',       
$$      
set s3_secret_access_key='xxxxxx';       
$$);      
      
SELECT duckdb_execute('duckdb_server',       
$$      
set s3_endpoint='s3.oss-cn-shanghai.aliyuncs.com';       
$$);

创建读取oss内容的视图

SELECT duckdb_execute('duckdb_server',       
$$      
create or replace view v_t2 as       
SELECT * FROM 's3://tekwvr20230826180728/t2.csv';      
$$);

将duckdb的视图导入postgresql|polardb

IMPORT FOREIGN SCHEMA public limit to (v_t2)  FROM SERVER   
duckdb_server INTO public;

在postgresql|polardb可以读取存储在oss的csv文件了

postgres=# select count(*) from v_t2 ;  
  count    
---------  
 1000000  
(1 row)

将oss的csv文件导入到postgresql|polardb

create table local_t2 as select * from v_t2 ;  
  
SELECT 1000000  
  
  
postgres=# select count(*) from local_t2;  
  count    
---------  
 1000000  
(1 row)

查看oss的csv文件和导入到postgresql|polardb中的数据是否一致:

postgres=# select * from v_t2 limit 10;  
 id | CAST((random() * 10000) AS INTEGER) |               info               |           ts              
----+-------------------------------------+----------------------------------+-------------------------  
  0 |                                9504 | b37a70d10249ec1c19e3ff36d3ae5d9c | 2023-08-26 10:12:52.712  
  1 |                                3650 | 93ce8d8c9047d5d53c3f4c33bd76ec50 | 2023-08-26 10:12:52.712  
  2 |                                3998 | 00ea04f7bfa038a1092d0fd10e814f76 | 2023-08-26 10:12:52.712  
  3 |                                9354 | 70f54f82dab5c6eb6c921e683d02eca1 | 2023-08-26 10:12:52.712  
  4 |                                7991 | 1d9422dc7633f63ec4dfbe7b4f10e2c3 | 2023-08-26 10:12:52.712  
  5 |                                9652 | 872fc6c314f9f548dfedc3edea79ef70 | 2023-08-26 10:12:52.712  
  6 |                                1791 | 2cdeae2af5e21c5dead86e5d79754d57 | 2023-08-26 10:12:52.712  
  7 |                                8911 | 0cc5fb6556183173768a21f7ba31cec0 | 2023-08-26 10:12:52.712  
  8 |                                9281 | 97f7b99b3e80dca4bdf932e231ceb9dc | 2023-08-26 10:12:52.712  
  9 |                                 218 | f8a61afc533da2791d6b11d597c31389 | 2023-08-26 10:12:52.712  
(10 rows)  
  
postgres=# select * from local_t2 limit 10;  
 id | CAST((random() * 10000) AS INTEGER) |               info               |           ts              
----+-------------------------------------+----------------------------------+-------------------------  
  0 |                                9504 | b37a70d10249ec1c19e3ff36d3ae5d9c | 2023-08-26 10:12:52.712  
  1 |                                3650 | 93ce8d8c9047d5d53c3f4c33bd76ec50 | 2023-08-26 10:12:52.712  
  2 |                                3998 | 00ea04f7bfa038a1092d0fd10e814f76 | 2023-08-26 10:12:52.712  
  3 |                                9354 | 70f54f82dab5c6eb6c921e683d02eca1 | 2023-08-26 10:12:52.712  
  4 |                                7991 | 1d9422dc7633f63ec4dfbe7b4f10e2c3 | 2023-08-26 10:12:52.712  
  5 |                                9652 | 872fc6c314f9f548dfedc3edea79ef70 | 2023-08-26 10:12:52.712  
  6 |                                1791 | 2cdeae2af5e21c5dead86e5d79754d57 | 2023-08-26 10:12:52.712  
  7 |                                8911 | 0cc5fb6556183173768a21f7ba31cec0 | 2023-08-26 10:12:52.712  
  8 |                                9281 | 97f7b99b3e80dca4bdf932e231ceb9dc | 2023-08-26 10:12:52.712  
  9 |                                 218 | f8a61afc533da2791d6b11d597c31389 | 2023-08-26 10:12:52.712  
(10 rows)

4、分析汇总数据.

窗口函数、聚合函数、分析函数通常用于数据分析.

对照

使用Polardb|PG提供的方法成本很低, 性能好, 同时几乎不破坏各个网点的用户使用习惯.

知识点

oss

fdw

duckdb_fdw

gdal: https://duckdb.org/docs/archive/0.8.1/extensions/spatial

plpython3u

parquet 格式

窗口函数

分析函数

思考

这种架构还适合什么应用场景?

使用oss低廉的存储、随时随地可访问, 打破各个应用之间的数据孤岛?

教学场景, 通过oss共享数据, 例如企业脱敏后的数据, 提供给学生进行数据分析和实验.

如果数据文件非常多, 如何提升读取效率? 是否可以通过通配符一次性读取多个文件?

为什么要将数据导入集中存储分析?

parquet为什么更适合作为书记分析的文件格式?

在PostgreSQL|polardb中除了使用duckdb_fdw导入oss的数据, 还有什么方法? 例如plpython3u?

参考

202303/20230308_01.md 《PolarDB-PG | PostgreSQL + duckdb_fdw + 阿里云OSS 实现高效低价的海量数据冷热存储分离》
202212/20221209_02.md 《PolarDB 开源版通过 duckdb_fdw 支持 parquet 列存数据文件以及高效OLAP》
202209/20220924_01.md 《用duckdb_fdw加速PostgreSQL分析计算, 提速40倍, 真香.》
202010/20201022_01.md 《PostgreSQL 牛逼的分析型功能 - 列存储、向量计算 FDW - DuckDB_fdw - 无数据库服务式本地lib库+本地存储》
202306/20230624_01.md 《使用DuckDB分析高中生联考成绩excel(xlst)数据, 文理选课分析》
202211/20221124_02.md 《DuckDB 0.6.0 支持 csv 并行读取功能, 提升查询性能》
202210/20221026_03.md 《DuckDB COPY 数据导入导出 - 支持csv, parquet格式, 支持CODEC设置压缩》
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
1月前
|
关系型数据库 分布式数据库 PolarDB
PolarDB 开源基础教程系列 7.2 应用实践之 跨境电商场景
本文介绍了如何在跨境电商场景中快速判断商标或品牌侵权,避免因侵权带来的法律纠纷。通过创建品牌表并使用PostgreSQL的pg_trgm插件和GIN索引,实现了高性能的字符串相似匹配功能。与传统方法相比,PolarDB|PostgreSQL的方法不仅提升了上万倍的查询速度,还解决了传统方法难以处理的相似问题检索。具体实现步骤包括创建品牌表、插入随机品牌名、配置pg_trgm插件及索引,并设置相似度阈值进行高效查询。此外,文章还探讨了字符串相似度计算的原理及应用场景,提供了进一步优化和扩展的方向。
62 11
|
1月前
|
搜索推荐 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 7.3 应用实践之 精准营销场景
本文介绍了基于用户画像的精准营销技术,重点探讨了如何通过标签组合快速圈选目标人群。实验分为三部分: 1. **传统方法**:使用字符串存储标签并进行模糊查询,但性能较差,每次请求都需要扫描全表。 2. **实验1**:引入`pg_trgm`插件和GIN索引,显著提升了单个模糊查询条件的性能。 3. **实验2**:改用数组类型存储标签,并结合GIN索引加速包含查询,性能进一步提升。 4. **实验3**:利用`smlar`插件实现近似度过滤,支持按标签重合数量或比例筛选。
49 3
|
2月前
|
Cloud Native 关系型数据库 分布式数据库
让PolarDB更了解您--PolarDB云原生数据库核心功能体验馆
让PolarDB更了解您——PolarDB云原生数据库核心功能体验馆,由阿里云数据库产品事业部负责人宋震分享。内容涵盖PolarDB技术布局、开源进展及体验馆三大部分。技术布局包括云计算加速数据库演进、数据处理需求带来的变革、软硬协同优化等;开源部分介绍了兼容MySQL和PostgreSQL的两款产品;体验馆则通过实际操作让用户直观感受Serverless、无感切换、SQL2Map等功能。
148 7
|
23天前
|
Cloud Native 关系型数据库 分布式数据库
客户说|信美相互人寿携手阿里云PolarDB,引领保险IFRS17场景创新
客户说|信美相互人寿携手阿里云PolarDB,引领保险IFRS17场景创新
|
2月前
|
NoSQL 关系型数据库 MySQL
阿里云PolarDB游戏场景最佳实践
阿里云PolarDB游戏场景最佳实践涵盖了数据库体系演进、行业优化、Redis解决方案、性能优化、备份还原及全球部署等内容。PolarDB通过共享存储、物理复制等技术提升读扩展和大容量支持,针对游戏行业的高IO需求进行优化,提供秒级备份与快速恢复能力。同时,PolarDB for Redis实现了一写多读架构,支持百TB级别的高性能存储,具备成本优势。该方案已在米哈游等大型游戏中广泛应用,确保了高并发下的稳定性和数据一致性,满足游戏行业的特殊需求。
122 36
|
2月前
|
运维 关系型数据库 分布式数据库
阿里云PolarDB:引领云原生数据库创新发展
阿里云PolarDB引领云原生数据库创新,2024云栖大会将分享其最新发展及在游戏行业的应用。PolarDB凭借弹性、高可用性、多写技术等优势,支持全球80多个站点,服务1万多家企业。特别是针对游戏行业,PolarDB助力Funplus等公司实现高效运维、成本优化和业务扩展。通过云原生能力,PolarDB推动游戏业务的全球化部署与快速响应,提升用户体验并保障数据安全。未来,PolarDB将继续探索AI、多云管理等前沿技术,为用户提供更智能的数据基础设施。
|
3月前
|
资源调度 关系型数据库 MySQL
PolarDB MySQL场景评测
PolarDB具备快速资源弹升能力,支持5秒探测窗口和1秒内完成资源扩展,适合电商促销和流量波动型SaaS应用。资源伸缩范围广泛,支持0-256核,适用于中小型企业到大型企业。资源伸缩过程中业务无感知,具有高稳定性和成熟性。支持最小0.5 PCU的资源颗粒度,确保成本控制和使用效率。此外,PolarDB支持所有只读节点的数据强一致性,性能不受影响。
74 0
|
6月前
|
存储 关系型数据库 分布式数据库
揭秘PolarDB:中国云原生数据库的超级英雄,如何颠覆传统数据存储?
在数字化时代,数据成为企业的核心资产,而云原生数据库则是推动企业转型的关键。PolarDB凭借其先进的存储计算分离架构,在性能、可靠性和易用性方面脱颖而出,成为国内领先的选择。它支持多种数据库引擎,提供多副本存储机制,并采用按量付费模式,有效降低管理和成本压力,助力企业实现高效、可靠的数字化转型。
120 1
|
5月前
|
关系型数据库 MySQL 数据库
mysql关系型数据库的学习
mysql关系型数据库的学习
55 0
|
6月前
|
关系型数据库 MySQL 分布式数据库
【开发者评测】PolarDB MySQL场景评测获奖名单公布
PolarDB MySQL场景评测获奖名单公布!!
113 0

相关产品

  • 云原生数据库 PolarDB
  • 推荐镜像

    更多