上篇我们讲了怎么利用 copy 命令借助于 Stage 把数据加载到 Databend 中,Databend 致力于构建一个完整的数据湖,也需要支持用户把数据从 Databend 中取走,这里 Databend 给三种可以把数据取走的办法:
External table 把数据存储在用户指定的 bucket 中
利用 Copy 命令把数据 unload 指定的 stage 中
利用 presign 获取内部 stage 中文件的下载地址
这个功能是某个 Databend 用户的需求,该用户现在使用了大数据中比较多的生态工具,数据交换使用的 Parquet 文件。现在该用户的做法是利用 Databend 提供数据写入,同时把 table 存到不同的 bucket 中供不同的大数据产品消费, 同时利用 Databend 提供数据汇集及查询分析能力。
create table tb01( id int, c1 varchar) 's3://mybucket/tb01' \
connection=(ACCESS_KEY_ID='minioadmin' \
SECRET_ACCESS_KEY='minioadmin' \
ENDPOINT_URL='http://127.0.0.1:9900');
以上命令会把 tb01 的数据放入对应的 bucket 下面,目录结构下:mybucket/tb01/db_id/tb_id/
这样这个 bucket 也可以给其它大数据程序独立的消费使用。但这里需要注意其它程序不能写 tb01 对应的文件。
这个功能对于 Databend Cloud 上就非常 Cool ,例如:用户可以借助于 Databend Cloud 计算的弹性,实现计算按时间计费,同时又可以把数据存到个人帐号的 Bucket 中,同时供实它大数据产品消费。同时可以利用 Databend Cloud 实现数据的统一入湖仓操作。
Copy 命令不只是支持把数据加载到对应的表里,还支持从对应的表里把数据读取出来放对应的 stage 中。具体语法如下:
create stage my_stage;
copy into @my_stage from tb_1 file_format=(type='ndjson');
#也支持导出固定的字段
#copy into @my_stage from (select id, c1 from tb_1 limit 10) file_format=(type=csv);
MySQL [default]> copy into @my_stage from tb_1;
Query OK, 0 rows affected (18.930 sec)
MySQL [default]>
MySQL [default]> list @my_stage;
+-------------------------------------------------------+----------+----------------------------------+-------------------------------+---------+
| name | size | md5 | last_modified | creator |
+-------------------------------------------------------+----------+----------------------------------+-------------------------------+---------+
| data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_0.ndjson | 67141080 | 6c9aeead0aff539900730f996360262d | 2022-10-21 08:02:50.000 +0000 | NULL |
| data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_1.ndjson | 67153185 | 56745fdc94db1dd618f815c8da07ee37 | 2022-10-21 08:02:52.000 +0000 | NULL |
| data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_2.ndjson | 67142790 | eb3a2ee3ddcfc5ef61309250cde6f379 | 2022-10-21 08:02:55.000 +0000 | NULL |
| data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_3.ndjson | 67113405 | 480983368d84ada46a370c09ffb14920 | 2022-10-21 08:02:57.000 +0000 | NULL |
| data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_4.ndjson | 67125735 | 291573fc47fbdd602af13752cba09535 | 2022-10-21 08:02:59.000 +0000 | NULL |
| data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_5.ndjson | 67132080 | 1f7781a3c201a7020d7eba7d49854d60 | 2022-10-21 08:03:02.000 +0000 | NULL |
| data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_6.ndjson | 45792045 | 68aba00e885f8aaa2c9f88c3fe4b886e | 2022-10-21 08:03:03.000 +0000 | NULL |
| t1.json | 98 | 6cdc83ea7b8d033bf74d026a666a99f2 | 2022-10-20 15:45:42.000 +0000 | NULL |
+-------------------------------------------------------+----------+----------------------------------+-------------------------------+---------+
8 rows in set (0.033 sec)
目前 copy into location 还不支持 CSV, TSV,NDJSON 压缩,这块功能可以比较快的补齐。如果你想降低文件传递的带宽可以使用 parquet 格式。
更多关于 unload data 的使用可以参考手册:https://databend.rs/doc/reference/sql/dml/dml-copy-into-location
大家可能发现对 unload 到外 stage 上的文件可以轻松的下载下来, unload 内部 stage 的文件就比较难获取出来。其实 Databend 早为大家想到这个问题及解决方案。
例如:
MySQL [default]> presign download @my_stage/data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_0.ndjson;
+--------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| method | headers | url |
+--------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GET | {"host":"127.0.0.1:9900"} | http://127.0.0.1:9900/databend/wubx/stage/my_stage/data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_0.ndjson?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20221021%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221021T080735Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=caa0db3c7db47fe3953257c2a04261170936eb56b181087bf571afe206964944 |
+--------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.026 sec)
curl 'http://127.0.0.1:9900/databend/wubx/stage/my_stage/data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_0.ndjson?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20221021%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221021T080735Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=caa0db3c7db47fe3953257c2a04261170936eb56b181087bf571afe206964944' -o data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_0.ndjson
ls -lh data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_0.ndjson
-rw-rw-r-- 1 wu wu 65M 10月 21 16:09 data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_0.ndjson
这是下载需要利用 presign 获取下载 URL 然后调用下载工作保存,指定一下文件名,该地址默认有效时间为 1 个小时,时间可调整。
同时这个命令也支持上传, 上传后文件名为 11.ndjson
MySQL [default]> presign upload @my_stage/11.ndjson;
+--------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| method | headers | url |
+--------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| PUT | {"host":"127.0.0.1:9900"} | http://127.0.0.1:9900/databend/wubx/stage/my_stage/11.ndjson?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20221021%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221021T081241Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0ccf52cb276ffb5254632f483117e74db4675f89dc723fe0ce34d8e75d89172e |
+--------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.027 sec)
curl -T data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_0.ndjson -XPUT 'http://127.0.0.1:9900/databend/wubx/stage/my_stage/11.ndjson?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20221021%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221021T081241Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0ccf52cb276ffb5254632f483117e74db4675f89dc723fe0ce34d8e75d89172e'
MySQL [default]> list @my_stage;
+-------------------------------------------------------+----------+----------------------------------+-------------------------------+---------+
| name | size | md5 | last_modified | creator |
+-------------------------------------------------------+----------+----------------------------------+-------------------------------+---------+
| 11.ndjson | 67141327 | 3baa41bfa758f2683cb4f9e0e4a292dd | 2022-10-21 08:14:36.000 +0000 | NULL |
+-------------------------------------------------------+----------+----------------------------------+-------------------------------+---------+
可以看到文件上传文的文件名是:11.ndjson 。
更多关于 presign 的使用可以关注:https://databend.rs/doc/reference/sql/ddl/presign/presign
Databend 结合 copy 命令和 presign 可以实现文件灵活交换。无须担心数据被锁死到 databend 中,其实 Databend 底层存储使用的 Parquet 文件也是可以支持直接解析获取数据。
Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式数仓。期待您的关注,一起探索云原生数仓解决方案,打造新一代开源 Data Cloud。
Databend 文档:https://databend.rs/
Twitter:https://twitter.com/Datafuse_Labs
Slack:https://datafusecloud.slack.com/
Wechat:Databend
GitHub :https://github.com/datafuselabs/databend