我正在尝试使用 Python 将 .csv 文件加载到 Apache Cassandra 数据库中。与 session.execute 集成的命令“COPY”似乎不起作用。它在 =’,’ 对应处给出了意外的缩进,但是…我读了一些内容,发现不支持以这种方式执行 COPY 命令。
在此脚本中,time_test 和 p 是两个浮点变量
from cassandra.cluster import Cluster cluster = Cluster() session = cluster.connect('myKEYSPACE') rows = session.execute('COPY table_test (time_test, p) from'/home/mypc/Desktop/testfile.csv' with delimiter=',' and header=true; ') print('DONE')
谢谢你的帮助!
在 Python 中,您无法直接使用 session.execute 执行 COPY 命令,因为 COPY 是 Cassandra 的 CQL 命令,通常只能通过 cqlsh(Cassandra 的命令行工具)或通过数据导入工具(如 cassandra-loader)来使用。
session.execute
COPY
cqlsh
cassandra-loader
Cassandra 驱动程序的 session.execute() 方法通常用于执行 CQL 查询(如 SELECT、INSERT 等),但它不支持直接执行包含文件路径的 COPY 命令,因为 COPY 需要与 Cassandra 的底层文件系统交互,而这是在 Cassandra 客户端 Python 驱动程序之外处理的。
session.execute()
SELECT
INSERT
解决这个问题的方法是: 1. 使用 cqlsh 来执行 COPY 命令。 2. 通过 Python 使用 INSERT 命令逐行读取 .csv 文件并将数据插入到 Cassandra 表中。
.csv
可以通过 Python 的 subprocess 模块调用 cqlsh 执行 COPY 命令。以下是一个示例:
subprocess
import subprocess # 定义 COPY 命令 cqlsh_command = """ COPY mykeyspace.table_test (time_test, p) FROM '/home/mypc/Desktop/testfile.csv' WITH DELIMITER=',' AND HEADER=TRUE; """ # 执行 cqlsh 命令 subprocess.run(['cqlsh', '--execute', cqlsh_command]) print('DONE')
如果不想使用 cqlsh,您可以使用 Python 代码逐行读取 .csv 文件,并使用 INSERT 命令将数据插入 Cassandra。
下面是一个示例代码,它使用 Python 的 csv 模块来读取 .csv 文件,并使用 INSERT 命令将每行数据插入 Cassandra:
csv
import csv from cassandra.cluster import Cluster # 连接到 Cassandra cluster = Cluster() session = cluster.connect('mykeyspace') # 替换为您的 Keyspace # 打开 CSV 文件并插入数据 with open('/home/mypc/Desktop/testfile.csv', 'r') as f: reader = csv.reader(f) next(reader) # 跳过 header for row in reader: time_test = float(row[0]) # 假设 time_test 是第一列,转换为浮点数 p = float(row[1]) # 假设 p 是第二列,转换为浮点数 session.execute( "INSERT INTO table_test (time_test, p) VALUES (%s, %s)", (time_test, p) ) print('DONE')
如果您不希望依赖 cqlsh,可以选择逐行读取 .csv 文件并使用 INSERT 命令将数据插入 Cassandra。然而,对于大数据量的导入,cqlsh 中的 COPY 命令会更加高效。