digoal
2022-10-26
PostgreSQL , parquet , aliyun OSS , AWS S3
DuckDB内置S3协议模块, 可以直接读写AWS S3对象存储, 实现数据湖架构.
阿里云OSS兼容AWS S3协议, 所以DuckDB也可以将数据存储在aliyun OSS实现数据湖架构. 在endpoint中加一个s3前缀即可.
https://help.aliyun.com/document_detail/451966.html
以华东1(杭州)地域为例,S3兼容的外网Endpoint格式为s3.oss-cn-hangzhou.aliyuncs.com,S3兼容的内网Endpoint格式为s3.oss-cn-hangzhou-internal.aliyuncs.com。如需使用其他地域,请对应替换Endpoint中的Region ID。关于Region和Endpoint的对应关系,请参见访问域名和数据中心。
https://help.aliyun.com/document_detail/31837.htm
阿里云云起实验室可以免费体验OSS的使用, 实验室地址如下:
对象存储OSS初体验
https://developer.aliyun.com/adc/scenarioSeries/3c2b97cca75845c7bc5d778af7b0d469
我们选择一个实验开始:
搭建基于OSS的图片分享网站
https://developer.aliyun.com/adc/scenario/90b2bceaf9954d6f8780f26a1c913385
使用开启后, 可以看到这个实验已经开通了OSS资源(读者请看自己实验的资源, 不要直接拷贝如下信息).
AK ID: LTAI5tMi42EuWSJ5s31H9jWz
AK Secret: WGChOGppUSU6jZCoUkqDo0eqOc91jx
Endpoint外网域名: oss-cn-shanghai.aliyuncs.com
Bucket名称: adc-oss-1872hd2
Object路径: OSSCTY/u-3ztwmndf/
读写OSS的方法
COPY <table_name> TO 's3://<Bucket名称>/<Object路径>/filename';
SELECT * FROM read_parquet('s3://<Bucket名称>/<Object路径>/filename');
例子:
D create table a(id int, info text);
D insert into a select range, md5(random()::text) from range(1,10000000);
D INSTALL httpfs;
D LOAD httpfs;
D set s3_access_key_id='LTAI5tMi42EuWSJ5s31H9jWz'; // AK ID
D set s3_secret_access_key='WGChOGppUSU6jZCoUkqDo0eqOc91jx'; // AK Secret
D set s3_endpoint='s3.oss-cn-shanghai.aliyuncs.com'; // Endpoint外网域名|内网域名
D copy a to 's3://adc-oss-1872hd2/OSSCTY/u-3ztwmndf/b.parquet';
D SELECT * FROM read_parquet('s3://adc-oss-1872hd2/OSSCTY/u-3ztwmndf/b.parquet') where id<10;
┌────┬──────────────────────────────────┐
│ id │ info │
├────┼──────────────────────────────────┤
│ 1 │ 491af8ec9e7fe43605454bac84267ebb │
│ 2 │ 52e67e9e42beeab2c1980cd0f881334b │
│ 3 │ 607ac7b43e7b63d543e4043d48e7a810 │
│ 4 │ 0745aa81f12943de807163cb7be52814 │
│ 5 │ c3bb7787313ed393d73aa3f1d91e2e28 │
│ 6 │ 49eef8c05e3415fd1eb3b0a37bd38bed │
│ 7 │ 5f7f52df3d90b82e52a32e0b9f7ab6ad │
│ 8 │ bf55f472eaee6e7dd46c5dc63a819888 │
│ 9 │ b14e2b9c6ae7b380649efa85d930049f │
│ 1 │ 6be62c882b86991d81c0f62449282f3b │
│ 2 │ 923414a7f16b730c8754e31f34bf9a9c │
│ 3 │ f94db37004a40a40736cb1d78ef033af │
│ 4 │ 04e2df6859a6b5089e891c986cb4ec29 │
│ 5 │ ff4901fbb1c492753b16e368d9e4d603 │
│ 6 │ abdbf67ab2e3021877778cc8f55d094f │
│ 7 │ cb2a54c72adaaf7aa96c5a07f9913b36 │
│ 8 │ c10c4e49f947ac1d06e9ef9389774d90 │
│ 9 │ 3a62ccfc42533090bf1dd71f46b27848 │
└────┴──────────────────────────────────┘
Run Time (s): real 0.646 user 0.075070 sys 0.048294
D select count(*) from read_parquet('s3://adc-oss-1872hd2/OSSCTY/u-3ztwmndf/b.parquet');
┌──────────────┐
│ count_star() │
├──────────────┤
│ 10000098 │
└──────────────┘
Run Time (s): real 1.049 user 0.050707 sys 0.023781
D select count(*) from read_parquet('s3://adc-oss-1872hd2/OSSCTY/u-3ztwmndf/b.parquet') where id=1;
┌──────────────┐
│ count_star() │
├──────────────┤
│ 2 │
└──────────────┘
Run Time (s): real 0.713 user 0.053176 sys 0.022546
这里用的是外网endpoint, 读写速度已经非常快. 如果是内网环境, 速度更加可观.
《DuckDB parquet 分区表 / Delta Lake(数据湖) 应用》
https://duckdb.org/docs/guides/import/s3_export
https://duckdb.org/docs/guides/import/s3_import
https://duckdb.org/docs/extensions/httpfs