• Unload data from Databend | 新手篇(4)


    上篇我们讲了怎么利用 copy 命令借助于 Stage 把数据加载到 Databend 中,Databend 致力于构建一个完整的数据湖,也需要支持用户把数据从 Databend 中取走,这里 Databend 给三种可以把数据取走的办法:

            External table 把数据存储在用户指定的 bucket

    • 利用 Copy 命令把数据 unload 指定的 stage 中

    • 利用 presign 获取内部 stage 中文件的下载地址

    External table 把数据存储在用户指定的 bucket 中

    这个功能是某个 Databend 用户的需求,该用户现在使用了大数据中比较多的生态工具,数据交换使用的 Parquet 文件。现在该用户的做法是利用 Databend 提供数据写入,同时把 table 存到不同的 bucket 中供不同的大数据产品消费, 同时利用 Databend 提供数据汇集及查询分析能力。

    1. create table tb01( id int, c1 varchar) 's3://mybucket/tb01' \
    2. connection=(ACCESS_KEY_ID='minioadmin' \
    3. SECRET_ACCESS_KEY='minioadmin' \
    4. 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 命令 unload 数据到 stage

    Copy 命令不只是支持把数据加载到对应的表里,还支持从对应的表里把数据读取出来放对应的 stage 中。具体语法如下:

    1. create stage my_stage;
    2. copy into @my_stage from tb_1 file_format=(type='ndjson');
    3. #也支持导出固定的字段
    4. #copy into @my_stage from (select id, c1 from tb_1 limit 10) file_format=(type=csv);
    5. MySQL [default]> copy into @my_stage from tb_1;
    6. Query OK, 0 rows affected (18.930 sec)
    7. MySQL [default]>
    8. MySQL [default]> list @my_stage;
    9. +-------------------------------------------------------+----------+----------------------------------+-------------------------------+---------+
    10. | name | size | md5 | last_modified | creator |
    11. +-------------------------------------------------------+----------+----------------------------------+-------------------------------+---------+
    12. | data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_0.ndjson | 67141080 | 6c9aeead0aff539900730f996360262d | 2022-10-21 08:02:50.000 +0000 | NULL |
    13. | data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_1.ndjson | 67153185 | 56745fdc94db1dd618f815c8da07ee37 | 2022-10-21 08:02:52.000 +0000 | NULL |
    14. | data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_2.ndjson | 67142790 | eb3a2ee3ddcfc5ef61309250cde6f379 | 2022-10-21 08:02:55.000 +0000 | NULL |
    15. | data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_3.ndjson | 67113405 | 480983368d84ada46a370c09ffb14920 | 2022-10-21 08:02:57.000 +0000 | NULL |
    16. | data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_4.ndjson | 67125735 | 291573fc47fbdd602af13752cba09535 | 2022-10-21 08:02:59.000 +0000 | NULL |
    17. | data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_5.ndjson | 67132080 | 1f7781a3c201a7020d7eba7d49854d60 | 2022-10-21 08:03:02.000 +0000 | NULL |
    18. | data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_6.ndjson | 45792045 | 68aba00e885f8aaa2c9f88c3fe4b886e | 2022-10-21 08:03:03.000 +0000 | NULL |
    19. | t1.json | 98 | 6cdc83ea7b8d033bf74d026a666a99f2 | 2022-10-20 15:45:42.000 +0000 | NULL |
    20. +-------------------------------------------------------+----------+----------------------------------+-------------------------------+---------+
    21. 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

    使用 presign 从内部 stage 上获取数据

    大家可能发现对 unload 到外 stage 上的文件可以轻松的下载下来, unload 内部 stage 的文件就比较难获取出来。其实 Databend 早为大家想到这个问题及解决方案。

    例如:

    1. MySQL [default]> presign download @my_stage/data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_0.ndjson;
    2. +--------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    3. | method | headers | url |
    4. +--------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    5. | 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 |
    6. +--------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    7. 1 row in set (0.026 sec)
    8. 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
    9. ls -lh data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_0.ndjson
    10. -rw-rw-r-- 1 wu wu 65M 1021 16:09 data_775b2883-e26f-4940-85fe-ab3e4cafa7be_32_0.ndjson

    这是下载需要利用 presign 获取下载 URL 然后调用下载工作保存,指定一下文件名,该地址默认有效时间为 1 个小时,时间可调整。

    同时这个命令也支持上传, 上传后文件名为 11.ndjson

    1. MySQL [default]> presign upload @my_stage/11.ndjson;
    2. +--------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    3. | method | headers | url |
    4. +--------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    5. | 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 |
    6. +--------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    7. 1 row in set (0.027 sec)
    8. 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'
    9. MySQL [default]> list @my_stage;
    10. +-------------------------------------------------------+----------+----------------------------------+-------------------------------+---------+
    11. | name | size | md5 | last_modified | creator |
    12. +-------------------------------------------------------+----------+----------------------------------+-------------------------------+---------+
    13. | 11.ndjson | 67141327 | 3baa41bfa758f2683cb4f9e0e4a292dd | 2022-10-21 08:14:36.000 +0000 | NULL |
    14. +-------------------------------------------------------+----------+----------------------------------+-------------------------------+---------+

    可以看到文件上传文的文件名是:11.ndjson 。

    更多关于 presign 的使用可以关注:https://databend.rs/doc/reference/sql/ddl/presign/presign

    总结

    Databend 结合 copy 命令和 presign 可以实现文件灵活交换。无须担心数据被锁死到 databend 中,其实 Databend 底层存储使用的 Parquet 文件也是可以支持直接解析获取数据。

    关于 Databend

    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

     

  • 相关阅读:
    【docker】cgroups资源限制
    【无标题】
    「网页开发|前端开发|Vue」06 公共组件与嵌套路由:让每一个页面都平等地拥有导航栏
    基于slate构建文档编辑器
    详细介绍Redis RDB和AOF两种持久化方式
    APS自动排程在制药行业的应用
    设计模式学习笔记 - 设计原则 - 2.开闭原则
    MySQL用户管理(CentOS)
    仿游戏热血江湖游戏类
    数据结构基础10:三路划分(解决快速排序的问题)
  • 原文地址:https://blog.csdn.net/Databend/article/details/127969335