如何不使用stdout和dsbulk工具将Cassandra数据导出为csv.gz格式
Cassandra直接导出gzip压缩CSV文件的实现方案
Cassandra原生不提供类似PostgreSQL
COPY TO PROGRAM直接在CQL层调用外部压缩工具导出文件的语法,但可以通过以下两种方案实现需求,无需使用dsbulk,也不会产生冗余的未压缩临时文件、不会把数据输出到终端stdout。
方案1:cqlsh结合管道直接导出压缩文件
适合快速导出、不想写代码的场景,Linux/macOS环境下直接执行以下命令即可:
cqlsh -e "COPY <你的键空间名>.<你的表名> TO '/dev/stdout' WITH HEADER = true AND DELIMITER = ','" | gzip > /目标路径/导出文件.csv.gz
- 该命令中cqlsh的查询输出直接通过管道传递给gzip进程压缩,全程不会在终端打印数据,也不会生成临时的未压缩CSV文件
- 可以根据需求调整COPY命令的参数,比如指定导出的列、添加过滤条件、修改分隔符等
方案2:Python驱动自定义导出
适合需要自定义导出逻辑、对导出过程可控性要求高的场景,仅需依赖Cassandra官方Python驱动,无需其他第三方工具:
首先安装依赖:
pip install cassandra-driver
然后运行如下脚本即可:
from cassandra.cluster import Cluster import gzip import csv # 配置Cassandra连接信息 CASSANDRA_HOSTS = ['127.0.0.1'] # 替换为你的节点IP KEYSPACE = 'your_keyspace' # 替换为你的键空间名 EXPORT_TABLE = 'your_table' # 替换为你的表名 EXPORT_COLUMNS = ['col1', 'col2', 'col3'] # 替换为要导出的列名 EXPORT_PATH = '/path/to/export.csv.gz' # 替换为导出文件路径 # 建立连接 cluster = Cluster(CASSANDRA_HOSTS) session = cluster.connect(KEYSPACE) # 逐行写入压缩文件 with gzip.open(EXPORT_PATH, 'wt', encoding='utf-8', newline='') as gz_file: csv_writer = csv.writer(gz_file) # 写入表头 csv_writer.writerow(EXPORT_COLUMNS) # 分页查询避免内存溢出 query = f"SELECT {','.join(EXPORT_COLUMNS)} FROM {EXPORT_TABLE}" rows = session.execute(query, timeout=None) for row in rows: csv_writer.writerow(row) # 释放连接 cluster.shutdown()
- 全程数据直接写入gzip压缩流,无stdout输出,无临时文件
- 可灵活添加查询过滤条件、自定义字段格式、设置导出限速等逻辑
内容的提问来源于stack exchange,提问作者Janani K
相关产品推荐
相关产品推荐

