Python中的Cassandra批量插入

4 投票
2 回答
15991 浏览
提问于 2025-04-18 01:45

我需要用 PythonCassandra 中进行批量 INSERT 操作。现在我使用的是最新的 Datastax Python 驱动。

这些 INSERT 操作是将多个列放在同一行中的批量插入。我会有很多行需要插入,但同一行中的数据会分成几块。

我可以像这个帖子中描述的那样,在 for loop 中逐个进行 INSERT 操作: 使用 Python Cassandra 模块的参数化查询 我正在使用参数化查询,值的格式和那个例子一样。

这并没有帮助: 如何在 Cassandra 中多行插入

我不太清楚如何组装一个参数化的 INSERT

BEGIN BATCH  
  INSERT(query values1)  
  INSERT(query values2)  
  ...  
APPLY BATCH;  
cursor.execute(batch_query)  

这真的可能吗?这样会加快我的 INSERT 吗?我需要插入数百万条记录,甚至几千条也太慢了。

我找到了一些关于 Java 的信息: http://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0

2 个回答

7

从驱动程序的2.0.0版本开始,新增了一个叫做 BatchStatement 的东西。如果你在使用ORM(对象关系映射),你还可以使用 BatchQuery

cluster = Cluster([sever_ip])
session = cluster.connect(keyspace)
insert_user = session.prepare('INSERT INTO table_name (id,name) VALUES (?, ?)')
batch = BatchStatement(consistency_level=ConsistencyLevel.QUORUM)
for i,j in some_value:
    try:
      batch.add(insert_user,(i,j))
      logger.info('Data Inserted into the table')
    except Exception as e:
      logger.error('The cassandra error: {}'.format(e))
session.execute(batch)
4

简介:目前,DataStax的Python驱动还不支持Cassandra 2.0中的CQL协议——这个功能正在开发中,测试版很快就会出来。到时候,你就可以使用一个BATCH语句,根据需要添加准备好的语句。

考虑到这一点,你可以使用你链接的帖子中描述的解决方案:准备一个包含一系列INSERTBATCH语句。这个方案的明显缺点是,你需要提前决定你的批处理里会有多少个插入操作,并且还得相应地拆分你的输入数据。

示例代码:

BATCH_SIZE = 10
INSERT_STMT = 'INSERT INTO T (id, fld1) VALUES (?, ?)';
BATCH_STMT = 'BEGIN BATCH'

for i in range(BATCH_SIZE):
  BATCH_STMT += INSERT_STMT

BATCH_STMT += 'APPLY BATCH;'
prep_batch = session.prepare(BATCH_STMT)

然后,当你接收到数据时,可以逐行处理,对于每BATCH_SIZE行数据,你将它们绑定到上面的prep_batch中并执行。

撰写回答