Python中的Cassandra批量插入
我需要用 Python
在 Cassandra
中进行批量 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 个回答
从驱动程序的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)
简介:目前,DataStax的Python驱动还不支持Cassandra 2.0中的CQL协议——这个功能正在开发中,测试版很快就会出来。到时候,你就可以使用一个BATCH
语句,根据需要添加准备好的语句。
考虑到这一点,你可以使用你链接的帖子中描述的解决方案:准备一个包含一系列INSERT
的BATCH
语句。这个方案的明显缺点是,你需要提前决定你的批处理里会有多少个插入操作,并且还得相应地拆分你的输入数据。
示例代码:
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
中并执行。