Apache Cloudberry™ (Incubating) 是 Apache 软件基金会孵化项目,由 Greenplum 和 PostgreSQL 衍生而来,作为领先的开源 MPP 数据库,可用于建设企业级数据仓库,并适用于大规模分析和 AI/ML 工作负载。
GitHub: https://github.com/apache/cloudberry
本篇文章将继续深入,重点讲解 Directory Table 的数据管理与分析操作,包括文件的导入、导出、删除、查询等常见任务,并通过结合函数接口展示文件内容解析与标签化的实际案例,帮助你全面掌握非结构化数据在数据库中的全生命周期管理。
数据管理操作
导入数据 Import data
有两种方式可以将非结构化数据文件导入到 Directory table 中,方法 -1 是使用 copy 工具,将单个数据文件导入。方法 -2 是使用 gpdirtableload 工具,批量将文件导入。
查看准备的数据文件
Note:在本地存储的文件目录中,已经存储一些非结构化文本文件,用于导入到 Directory table 中。
ls -trl;
输出:
pwd/home/gpadmin/datafilels -trltotal 4-rw-rw-r--. 1 gpadmin gpadmin 215 Oct 16 14:44 s3.yaml
使用 copy 工具,导入单个数据文件
Note:重复导入数据文件,如果采用相同的 relative_path 值,则会发生主键冲突的错误。
dirhouse=# \COPY BINARY dir_tablename_oss FROM '/home/gpadmin/datafile/s3.yaml' 's3.yaml';参数Notedir_tablename_oss:目标表名称/home/gpadmin/datafile/s3.yaml:源文件在本地的存储位置s3.yaml:RELATIVE_PATH字段值
输出:
dirhouse=# \COPY BINARY dir_tablename_oss FROM '/home/gpadmin/datafile/s3.yaml' 's3.yaml';COPY 1dirhouse=# select * from dir_tablename_oss;relative_path | size | last_modified | md5 | tag---------------+------+------------------------+----------------------------------+-----s3.yaml | 215 | 2024-10-16 14:51:57+08 | e0452780f3982be7aebaafba63d6e8e4 |(1 row)dirhouse=# \COPY BINARY dir_tablename_oss FROM '/home/gpadmin/datafile/s3.yaml' 's3.yaml';ERROR: duplicate key value violates unique constraint "dir_tablename_oss_pkey"DETAIL: Key (relative_path)=(s3.yaml) already exists.
使用 copy 工具,导入单个数据文件,以及携带标签信息
Note:重复导入数据文件,采用相同 relative_path 字段值,则会返回主键冲突的错误。
dirhouse=# \COPY BINARY dir_tablename_oss FROM '/home/gpadmin/datafile/s3.yaml' 's3.yaml' with tag 'file type:yaml';参数Notedir_tablename_oss:表名称/home/gpadmin/datafile/s3.yaml:源文件在本地的存储位置s3.yaml:RELATIVE_PATH字段值file type:yaml:TAGS字段值
输出:
dirhouse=# \COPY BINARY dir_tablename_oss FROM '/home/gpadmin/datafile/s3.yaml' 's3.yaml' with tag 'file type:yaml';COPY 1dirhouse=# select * from directory_table('dir_tablename_oss');scoped_file_url | relative_path | tag | size | last_modified | md5 |content-------------------------------------+---------------+-----------------+------+------------------------+----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------/16424/16418/16398_dirtable/s3.yaml | s3.yaml | file type:yaml | 215 | 2024-10-16 15:00:18+08 | e0452780f3982be7aebaafba63d6e8e4 | \x65786563757461626c65706174683a202f7573722f6c6f63616c2f636c6f756462657272792d64622f62696e2f67706261636b75705f73335f706c7567696e0a6f7074696f6e733a0a2020656e64706f696e743a20687474703a2f2f31302e31332e392e3136393a393132330a20206177735f6163636573735f6b65795f69643a206d696e696f61646d696e0a20206177735f7365637265745f6163636573735f6b65793a206d696e696f61646d696e0a20206275636b65743a20746573746275636b65740a2020666f6c6465723a206261636b75700a(1 row)
使用 gpdirtableload 工具,批量导入数据文件
Note:本地文件上传到数据库,建议可以将上传后的 relative_path 与本地目录保持一致,方便对文件进行管理。
gpdirtableload --mode upload --database dirhouse --input-file /home/gpadmin/datafile --dest-path dir_file_path --table dir_tablename_oss --verbose参数Notemode:upload,上传模式database:dirhouse,数据库实例名称input-file:/home/gpadmin/datafile,数据文件在本地的存储位置dest-path:dir_file_path,对应reletive_path字段值的前半部分,后半部分是文件名称table:dir_tablename_oss,表名称verbose:无
输出:
pwd/home/gpadmin/datafilels -trltotal 16-rw-rw-r--. 1 gpadmin gpadmin 215 Oct 16 14:44 s3.yaml-rw-rw-r--. 1 gpadmin gpadmin 215 Oct 16 15:08 s4.yaml-rw-rw-r--. 1 gpadmin gpadmin 215 Oct 16 15:08 s5.yaml-rw-rw-r--. 1 gpadmin gpadmin 215 Oct 16 15:09 s6.yamlgpdirtableload --mode upload --database dirhouse --input-file home/gpadmin/datafile --dest-path dir_file_path --table dir_tablename_oss --verbose2024-10-16 15:18:03|INFO|gpdirtableload session started 2024-10-16 15:18:03Password: input password!2024-10-16 15:18:09|DEBUG|connection string: user=gpadmin host=localhost port=5432 database=dirhouse2024-10-16 15:18:09|DEBUG|Successfully connected to database2024-10-16 15:18:09|DEBUG|GPDB version is: 1.5.3 build dev.18.g9a8ee6c42024-10-16 15:18:09|INFO|running time: 6.54 seconds2024-10-16 15:18:09|INFO|gpdirtableload succeededpsql -d dirhouse -U gpadminpsql (14.4, server 14.4)Type "help" for help.dirhouse=# select * from directory_table('dir_tablename_oss');scoped_file_url | relative_path | tag | size | last_modified | md5 |content-------------------------------------+---------------+-----+------+------------------------+----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------/16424/16418/16398_dirtable/dir_file_path/s5.yaml | dir_file_path/s5.yaml | | 215 | 2024-10-16 15:18:09+08 | e0452780f3982be7aebaafba63d6e8e4 | \x65786563757461626c65706174683a202f7573722f6c6f63616c2f636c6f756462657272792d64622f62696e2f67706261636b75705f73335f706c7567696e0a6f7074696f6e733a0a2020656e64706f696e743a20687474703a2f2f31302e31332e392e3136393a393132330a20206177735f6163636573735f6b65795f69643a206d696e696f61646d696e0a20206177735f7365637265745f6163636573735f6b65793a206d696e696f61646d696e0a20206275636b65743a20746573746275636b65740a2020666f6c6465723a206261636b75700a/16424/16418/16398_dirtable/dir_file_path/s6.yaml | dir_file_path/s6.yaml | | 215 | 2024-10-16 15:18:09+08 | e0452780f3982be7aebaafba63d6e8e4 | \x65786563757461626c65706174683a202f7573722f6c6f63616c2f636c6f756462657272792d64622f62696e2f67706261636b75705f73335f706c7567696e0a6f7074696f6e733a0a2020656e64706f696e743a20687474703a2f2f31302e31332e392e3136393a393132330a20206177735f6163636573735f6b65795f69643a206d696e696f61646d696e0a20206177735f7365637265745f6163636573735f6b65793a206d696e696f61646d696e0a20206275636b65743a20746573746275636b65740a2020666f6c6465723a206261636b75700a/16424/16418/16398_dirtable/dir_file_path/s3.yaml | dir_file_path/s3.yaml | | 215 | 2024-10-16 15:18:09+08 | e0452780f3982be7aebaafba63d6e8e4 | \x65786563757461626c65706174683a202f7573722f6c6f63616c2f636c6f756462657272792d64622f62696e2f67706261636b75705f73335f706c7567696e0a6f7074696f6e733a0a2020656e64706f696e743a20687474703a2f2f31302e31332e392e3136393a393132330a20206177735f6163636573735f6b65795f69643a206d696e696f61646d696e0a20206177735f7365637265745f6163636573735f6b65793a206d696e696f61646d696e0a20206275636b65743a20746573746275636b65740a2020666f6c6465723a206261636b75700a/16424/16418/16398_dirtable/dir_file_path/s4.yaml | dir_file_path/s4.yaml | | 215 | 2024-10-16 15:18:09+08 | e0452780f3982be7aebaafba63d6e8e4 | \x65786563757461626c65706174683a202f7573722f6c6f63616c2f636c6f756462657272792d64622f62696e2f67706261636b75705f73335f706c7567696e0a6f7074696f6e733a0a2020656e64706f696e743a20687474703a2f2f31302e31332e392e3136393a393132330a20206177735f6163636573735f6b65795f69643a206d696e696f61646d696e0a20206177735f7365637265745f6163636573735f6b65793a206d696e696f61646d696e0a20206275636b65743a20746573746275636b65740a2020666f6c6465723a206261636b75700a(4 rows)
删除数据
删除 Directory table 中指定的一个数据文件。
Note:需管理员权限,或者表 owner 权限。
dirhouse=# SELECT remove_file('dir_tablename_oss', 's3.yaml');参数Notedir_tablename_oss:表名称s3.yaml:对应表中RELATIVE_PATH字段值
输出:
dirhouse=# SELECT remove_file('dir_tablename_oss', 's3.yaml');remove_file-------------t(1 row)
导出数据
将 Directory table 表中的数据文件下载到本地路径存储。有两种方式可以进行数据文件的导出,方式 -1 是导出表中的单个数据文件,可以通过指定 relative_path 字段导出对应目标数据文件,方式 -2 是导出表中的所有数据文件,如果全量数据文件过大,则需要评估时间消耗。
Note:需管理员权限,或者表 owner 权限。
使用 copy 工具,导出 Directory table 表中数据文件到本地路径
dirhouse=# \COPY BINARY Directory table dir_tablename_oss 's4.yaml' to '/home/gpadmin/destfile/s4.yaml';参数Notedir_tablename_oss:表名s4.yaml:指定的目标数据文件信息,对应表中relative_path字段值/home/gpadmin/destfile/s4.yaml:数据文件在本地的存储位置,必须是包括文件名称的完整路径输出:dirhouse=# \COPY BINARY Directory table dir_tablename_oss 's4.yaml' to '/home/gpadmin/destfile/s4.yaml';COPY 1dirhouse=# \qls -trltotal 4-rw-rw-r--. 1 gpadmin gpadmin 215 Oct 16 15:51 s4.yaml
使用 gpdirtableload 工具,导出 Directory table 表中所有数据文件到本地路径
Note:在导出表中全部数据文件时,需要指定用户,该用户需要拥有管理员或者表 owner 权限。
gpdirtableload -d dirhouse --dest-path /home/gpadmin/download --table dir_tablename_oss --mode download -V -U gpadmin参数Noted:dirhouse,访问的数据库实例名称dest-path:/home/gpadmin/download,数据文件在本地的存储目录table:dir_tablename_oss,表名称mode:download,下载模式U:gpadmin,用户帐号
输出:
pwd/home/gpadmin/downloadls -rltotal 0gpdirtableload -d dirhouse --dest-path home/gpadmin/download --table dir_tablename_oss --mode download -V -U gpadmin2024-10-16 15:56:10|INFO|gpdirtableload session started 2024-10-16 15:56:10Password:2024-10-16 15:56:14|DEBUG|connection string: user=gpadmin host=localhost port=5432 database=dirhouse2024-10-16 15:56:14|DEBUG|Successfully connected to database2024-10-16 15:56:14|DEBUG|GPDB version is: 1.5.3 build dev.18.g9a8ee6c42024-10-16 15:56:15|INFO|running time: 4.55 seconds2024-10-16 15:56:15|INFO|gpdirtableload succeeded$ ls -trltotal 12-rw-rw-r--. 1 gpadmin gpadmin 215 Oct 16 15:56 s4.yaml-rw-rw-r--. 1 gpadmin gpadmin 215 Oct 16 15:56 s5.yaml-rw-rw-r--. 1 gpadmin gpadmin 215 Oct 16 15:56 s6.yamldrwxrwxr-x. 2 gpadmin gpadmin 66 Oct 16 15:56 dir_file_pathcd dir_file_pathlss3.yaml s4.yaml s5.yaml s6.yaml
使用 gpdirtableload 工具,导出 Directory table 表中的某个数据文件到本地路径
gpdirtableload -d dirhouse --dest-path /home/gpadmin/download --table dir_tablename_oss --input-file s6.yaml --mode download -V -U gpadmin参数Noted:dirhouse,访问的数据库实例名称dest-path:/home/gpadmin/download,数据文件在本地的存储位置table:dir_tablename_oss,表名称input-file:s6.yaml,指定的具体数据文件,对应relative_path字段信息mode:download,下载模式U:gpadmin,用户帐号
查询数据
查询表中所有数据文件
Note:不含有 content、scoped_file_url、dirtable_oid 字段信息。
select * from dir_tablename_oss;参数Notedir_tablename_oss:表名称输出:dirhouse=# select * from dir_tablename_oss;relative_path | size | last_modified | md5 | tag---------------+------+------------------------+----------------------------------+-----s4.yaml | 215 | 2024-10-16 15:18:09+08 | e0452780f3982be7aebaafba63d6e8e4 |dir_file_path/s4.yaml | 215 | 2024-10-16 15:24:31+08 | e0452780f3982be7aebaafba63d6e8e4 |dir_file_path/s6.yaml | 215 | 2024-10-16 15:24:31+08 | e0452780f3982be7aebaafba63d6e8e4 |s5.yaml | 215 | 2024-10-16 15:18:09+08 | e0452780f3982be7aebaafba63d6e8e4 |s6.yaml | 215 | 2024-10-16 15:18:09+08 | e0452780f3982be7aebaafba63d6e8e4 |dir_file_path/s3.yaml | 215 | 2024-10-16 15:24:31+08 | e0452780f3982be7aebaafba63d6e8e4 |dir_file_path/s5.yaml | 215 | 2024-10-16 15:24:31+08 | e0452780f3982be7aebaafba63d6e8e4 |(7 rows)
使用 directory_table()函数,查询表中所有数据文件
Note:可以看到 content 字段信息,但是不含 dirtable_oid 字段信息。
❗️请谨慎使用 directory_table()函数。如果 content 字段很大,则会造成查询很慢或者报错,可用通过导出文件的方式去查看内容。
select * from directory_table('dir_tablename_oss');参数Notedir_tablename_oss:表名称directory_table:内置函数名称
输出:
Note:关于 content 字段信息,是 directory_table()函数读取对象存储桶中文件,输出的信息。
dirhouse=# select * from directory_table('dir_tablename_oss');scoped_file_url | relative_path | tag | size | last_modified | md5 |content-----------------------------------------+---------------+-----+------+------------------------+----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------/16424/16418/16398_dirtable/s5.yaml | s5.yaml | | 215 | 2024-10-16 15:18:09+08 | e0452780f3982be7aebaafba63d6e8e4 | \x65786563757461626c65706174683a202f7573722f6c6f63616c2f636c6f756462657272792d64622f62696e2f67706261636b75705f73335f706c7567696e0a6f7074696f6e733a0a2020656e64706f696e743a20687474703a2f2f31302e31332e392e3136393a393132330a20206177735f6163636573735f6b65795f69643a206d696e696f61646d696e0a20206177735f7365637265745f6163636573735f6b65793a206d696e696f61646d696e0a20206275636b65743a20746573746275636b65740a2020666f6c6465723a206261636b75700a/16424/16418/16398_dirtable/s6.yaml | s6.yaml | | 215 | 2024-10-16 15:18:09+08 | e0452780f3982be7aebaafba63d6e8e4 | \x65786563757461626c65706174683a202f7573722f6c6f63616c2f636c6f756462657272792d64622f62696e2f67706261636b75705f73335f706c7567696e0a6f7074696f6e733a0a2020656e64706f696e743a20687474703a2f2f31302e31332e392e3136393a393132330a20206177735f6163636573735f6b65795f69643a206d696e696f61646d696e0a20206177735f7365637265745f6163636573735f6b65793a206d696e696f61646d696e0a20206275636b65743a20746573746275636b65740a2020666f6c6465723a206261636b75700a/16424/16418/16398_dirtable/dir_file_path/s3.yaml | dir_file_path/s3.yaml | | 215 | 2024-10-16 15:24:31+08 | e0452780f3982be7aebaafba63d6e8e4 | \x65786563757461626c65706174683a202f7573722f6c6f63616c2f636c6f756462657272792d64622f62696e2f67706261636b75705f73335f706c7567696e0a6f7074696f6e733a0a2020656e64706f696e743a20687474703a2f2f31302e31332e392e3136393a393132330a20206177735f6163636573735f6b65795f69643a206d696e696f61646d696e0a20206177735f7365637265745f6163636573735f6b65793a206d696e696f61646d696e0a20206275636b65743a20746573746275636b65740a2020666f6c6465723a206261636b75700a/16424/16418/16398_dirtable/dir_file_path/s5.yaml | dir_file_path/s5.yaml | | 215 | 2024-10-16 15:24:31+08 | e0452780f3982be7aebaafba63d6e8e4 | \x65786563757461626c65706174683a202f7573722f6c6f63616c2f636c6f756462657272792d64622f62696e2f67706261636b75705f73335f706c7567696e0a6f7074696f6e733a0a2020656e64706f696e743a20687474703a2f2f31302e31332e392e3136393a393132330a20206177735f6163636573735f6b65795f69643a206d696e696f61646d696e0a20206177735f7365637265745f6163636573735f6b65793a206d696e696f61646d696e0a20206275636b65743a20746573746275636b65740a2020666f6c6465723a206261636b75700a/16424/16418/16398_dirtable/s4.yaml | s4.yaml | | 215 | 2024-10-16 15:18:09+08 | e0452780f3982be7aebaafba63d6e8e4 | \x65786563757461626c65706174683a202f7573722f6c6f63616c2f636c6f756462657272792d64622f62696e2f67706261636b75705f73335f706c7567696e0a6f7074696f6e733a0a2020656e64706f696e743a20687474703a2f2f31302e31332e392e3136393a393132330a20206177735f6163636573735f6b65795f69643a206d696e696f61646d696e0a20206177735f7365637265745f6163636573735f6b65793a206d696e696f61646d696e0a20206275636b65743a20746573746275636b65740a2020666f6c6465723a206261636b75700a/16424/16418/16398_dirtable/dir_file_path/s4.yaml | dir_file_path/s4.yaml | | 215 | 2024-10-16 15:24:31+08 | e0452780f3982be7aebaafba63d6e8e4 | \x65786563757461626c65706174683a202f7573722f6c6f63616c2f636c6f756462657272792d64622f62696e2f67706261636b75705f73335f706c7567696e0a6f7074696f6e733a0a2020656e64706f696e743a20687474703a2f2f31302e31332e392e3136393a393132330a20206177735f6163636573735f6b65795f69643a206d696e696f61646d696e0a20206177735f7365637265745f6163636573735f6b65793a206d696e696f61646d696e0a20206275636b65743a20746573746275636b65740a2020666f6c6465723a206261636b75700a/16424/16418/16398_dirtable/dir_file_path/s6.yaml | dir_file_path/s6.yaml | | 215 | 2024-10-16 15:24:31+08 | e0452780f3982be7aebaafba63d6e8e4 | \x65786563757461626c65706174683a202f7573722f6c6f63616c2f636c6f756462657272792d64622f62696e2f67706261636b75705f73335f706c7567696e0a6f7074696f6e733a0a2020656e64706f696e743a20687474703a2f2f31302e31332e392e3136393a393132330a20206177735f6163636573735f6b65795f69643a206d696e696f61646d696e0a20206177735f7365637265745f6163636573735f6b65793a206d696e696f61646d696e0a20206275636b65743a20746573746275636b65740a2020666f6c6465723a206261636b75700a(7 rows)
使用 directory_table_without_content()函数,查询表中所有数据文件
Note:不含 content 字段信息。
select * from directory_table_without_content('dir_tablename_oss');参数Notedir_tablename_oss:表名称directory_table_without_content:内置函数名称输出:dirhouse=# select * from directory_table_without_content('dir_tablename_oss');scoped_file_url | relative_path | tag | size | last_modified | md5 | dirtable_oid-----------------------------------------+---------------+-----+------+------------------------+----------------------------------+--------------/16424/16418/16398_dirtable/s4.yaml | s4.yaml | | 215 | 2024-10-16 15:18:09+08 | e0452780f3982be7aebaafba63d6e8e4 | 16429/16424/16418/16398_dirtable/dir_file_path/s4.yaml | dir_file_path/s4.yaml | | 215 | 2024-10-16 15:24:31+08 | e0452780f3982be7aebaafba63d6e8e4 | 16429/16424/16418/16398_dirtable/dir_file_path/s6.yaml | dir_file_path/s6.yaml | | 215 | 2024-10-16 15:24:31+08 | e0452780f3982be7aebaafba63d6e8e4 | 16429/16424/16418/16398_dirtable/s5.yaml | s5.yaml | | 215 | 2024-10-16 15:18:09+08 | e0452780f3982be7aebaafba63d6e8e4 | 16429/16424/16418/16398_dirtable/s6.yaml | s6.yaml | | 215 | 2024-10-16 15:18:09+08 | e0452780f3982be7aebaafba63d6e8e4 | 16429/16424/16418/16398_dirtable/dir_file_path/s3.yaml | dir_file_path/s3.yaml | | 215 | 2024-10-16 15:24:31+08 | e0452780f3982be7aebaafba63d6e8e4 | 16429/16424/16418/16398_dirtable/dir_file_path/s5.yaml | dir_file_path/s5.yaml | | 215 | 2024-10-16 15:24:31+08 | e0452780f3982be7aebaafba63d6e8e4 | 16429(7 rows)
使用 relative_path 字段,检索目标数据文件
Note:relative_path 字段为 TEXT 数据类型,支持 like 通配符方式进行检索
dirhouse=# select * from dir_tablename_oss where relative_path = 'dir_file_path/s4.yaml';参数Notedir_tablename_oss:表名称dir_file_path/s4.yaml:指定的目标数据文件,对应表中的relative_path字段信息输出:dirhouse=# select * from dir_tablename_oss where relative_path = 'dir_file_path/s4.yaml';relative_path | size | last_modified | md5 | tag---------------+------+------------------------+----------------------------------+-----dir_file_path/s4.yaml | 215 | 2024-10-16 15:24:31+08 | e0452780f3982be7aebaafba63d6e8e4 |(1 row)
使用 tag 字段,检索目标数据文件
Note:tag 字段为 TEXT 数据类型,支持 like 通配符方式进行检索。
dirhouse=# select * from dir_tablename_oss where tag = 'file type:yaml';参数Notedir_tablename_oss:表名称file type:yaml:tag字段值
输出:
Note:针对 content 字段信息,是通过 directory_table()函数读取对象存储桶中的文件获取到的信息。
dirhouse=# select*from dir_tablename_oss where tag ='file type:yaml';relative_path | size | last_modified | md5 | tag---------------+------+------------------------+----------------------------------+-----------------s3.yaml | 215|2024-10-1810:40:18+08| e0452780f3982be7aebaafba63d6e8e4 | file type:yaml(1row)
高级分析
HashML 是一款面向数据科学与 AI 应用的集成工具,支持机器学习、深度学习及大模型相关算法的开发、微调与推理部署。
在 Apache Cloudberry 数据库中,Directory Table 可与 HashML 深度集成,用于实现非结构化数据的高级分析(Advanced Analytics)。通过调用 HashML 提供的算法库与 API,系统能够对存储于 Directory Table 中的非结构化数据文件进行自动化解析、清洗与格式转换,生成高质量、结构化的语料数据。
这些经处理的数据可直接应用于 AI 模型的训练、微调及企业知识库构建等场景,从而显著提升数据利用效率与模型性能。
结语
随着 AI 应用对数据质量和多样性的要求不断提高,非结构化数据管理的重要性日益凸显。Apache Cloudberry 通过 Directory Table 实现了数据库与对象存储的融合,为文件级数据的统一管理与分析提供了高效方案。借助这一能力,开发者能够更轻松地构建面向智能应用的数据底座,为后续的语料管理与 AI 模型训练奠定坚实基础。
👇🏻️扫码加入 Apache Cloudberry 交流群👇🏻️





