小能豆

使用 Python 将 .csv 文件加载到 Apache Cassandra 中的问题

py

我正在尝试使用 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')

谢谢你的帮助!


阅读 25

收藏
2024-12-26

共1个答案

小能豆

在 Python 中,您无法直接使用 session.execute 执行 COPY 命令,因为 COPY 是 Cassandra 的 CQL 命令,通常只能通过 cqlsh(Cassandra 的命令行工具)或通过数据导入工具(如 cassandra-loader)来使用。

Cassandra 驱动程序的 session.execute() 方法通常用于执行 CQL 查询(如 SELECTINSERT 等),但它不支持直接执行包含文件路径的 COPY 命令,因为 COPY 需要与 Cassandra 的底层文件系统交互,而这是在 Cassandra 客户端 Python 驱动程序之外处理的。

解决这个问题的方法是:
1. 使用 cqlsh 来执行 COPY 命令。
2. 通过 Python 使用 INSERT 命令逐行读取 .csv 文件并将数据插入到 Cassandra 表中。

方法一:使用 cqlsh 执行 COPY 命令

可以通过 Python 的 subprocess 模块调用 cqlsh 执行 COPY 命令。以下是一个示例:

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')

方法二:使用 Python 的 INSERT 命令逐行插入数据

如果不想使用 cqlsh,您可以使用 Python 代码逐行读取 .csv 文件,并使用 INSERT 命令将数据插入 Cassandra。

下面是一个示例代码,它使用 Python 的 csv 模块来读取 .csv 文件,并使用 INSERT 命令将每行数据插入 Cassandra:

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')

关键点:

  1. 方法一是通过外部工具(cqlsh)来加载数据,适合大数据量的导入。
  2. 方法二适合处理较小的文件或需要定制的操作,可以逐行处理数据并插入到 Cassandra 中。

总结

如果您不希望依赖 cqlsh,可以选择逐行读取 .csv 文件并使用 INSERT 命令将数据插入 Cassandra。然而,对于大数据量的导入,cqlsh 中的 COPY 命令会更加高效。

2024-12-26