首页 文章

Cassandra Batch插入Python

提问于
浏览
2

我需要使用 PythonCassandra 中批量 INSERT . 我正在使用最新的 Datastax python驱动程序 .

INSERTS 是将在同一行中的批次列 . 我将要插入许多行,但数据块将在同一行中 .

我可以在 for loop 中单独执行 INSERTS ,如本文所述:Parameterized queries with the Python Cassandra Module我正在使用参数化查询,该示例中显示的值 .

这没有帮助:How to multi insert rows in cassandra

我不清楚如何组装参数化INSERT:

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

这甚至可能吗?这会加速我的 INSERTS 吗?我必须做数百万 . 甚至数千人花了太长时间 . 我找到了一些Java信息:http://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0

4 回答

  • 0

    简介:现在DataStax Python驱动程序还没有正在进行中,而且测试版很快就会出现 . 此时,您将能够拥有 BATCH 语句,您可以根据需要添加绑定的预准备语句 .

    考虑到上述情况,您可以使用的解决方案是您链接的帖子中描述的解决方案:准备一个包含 BATCH 和一系列 INSERT 的语句 . 此解决方案的明显缺点是您必须相应地拆分输入数据 .

    示例代码:

    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 并执行它 .

  • 0

    你看过这些官方文档吗? ThisThis

  • 2

    我已经看过它并厌倦了在Python代码中做到这一点 . 我需要参数化条目 . 我需要编写代码来移动超过100M * 16的条目 . 数据以16个为一组,在同一个Cassandra Row的不同列中按顺序插入 . 看到这个:
    Parameterized queries with the Python Cassandra Module

    query = "UPDATE StandardString1 SET :c1 = :v1, :c2 = :v2 WHERE KEY = :key"
    values [dict(c1="ca1", v1="va1", c2="col", v2="val", key="ka"),  
         dict(c1="cb1", v1="vb1", c2="col", v2="val", key="kb"),  
         dict(c1="cc1", v1="vc1", c2="col", v2="val", key="kc"),  
         dict(c1="cd1", v1="vd1", c2="col", v2="val", key="kd")]  
    for value in values:  
         cursor.execute(query, value)
    

    我可以做到以上 . 如何使用BATCH进行'for'循环???
    这会有帮助吗?

  • 0
    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)
    

相关问题