【问题标题】:fastest way of inserting into cassandra using python cassandra driver使用 python cassandra 驱动程序插入 cassandra 的最快方法
【发布时间】:2017-11-05 20:17:51
【问题描述】:

我正在使用 python Cassandra 驱动程序将多个条目插入并更新到 Cassandra 中的表中。目前我的代码如下:

cluster = Cluster()
session = cluster.connect('db')
for a in list:
    if bool:
        # calculate b
        session.execute("UPDATE table SET col2 = %s WHERE col1 = %s", (b, a))
    else:
        # calculate b
        session.execute("INSERT INTO table(col1, col2) VALUES(%s, %s)", (a, b))

这种插​​入和更新方法非常慢,因为列表中要插入的条目数量(都是唯一的)非常多。有没有更快的方法?

【问题讨论】:

  • 使用 Session.execute_async 方法和准备好的语句
  • bool 来自哪里?它是一个内置的类名,不要将它用于您的对象
  • @AzatIbrakov execute_async() 是否按顺序执行查询?如果是这样,那么我可以使用 execute_async() 执行许多查询,只需在最后一次调用 session.execute_async() 返回的 ResponseFuture 对象上调用 result(),对吗?如果不是,那么我应该怎么做才能确保所有查询都已执行(即所有插入都已完成)?
  • “按顺序”是什么意思?它们应该是异步的,你为什么需要订单?

标签: python cassandra-3.0


【解决方案1】:

一般而言,对于这种情况,您将通过增加对 Cassandra 的并发写入数来获得最佳性能。

您可以使用 execute_concurrent 使用 Datastax Python Cassandra 驱动程序来完成此操作

根据您的描述,值得注意的是,对于您的情况,Update 和带有 Cassandra 的 Insert 之间没有区别。 (即,您可以简单地从 else 子句中为 (a, b) 的所有值执行插入语句。

你会想要创建一个准备好的语句。

与其在 for 循环中一次插入一个,不如考虑预先计算 (a,b) 对组作为 execute_concurrent 的输入;您还可以编写生成器或生成器表达式作为execute_concurrent 的输入。

例子:

parameters = ((a, calculate_b(a)) for a in my_list)
execute_concurrent_with_args(my_session, my_prepared_statement, parameters)

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 1970-01-01
    • 2017-08-07
    • 2016-06-28
    • 2019-04-18
    • 2016-01-22
    • 1970-01-01
    • 2023-04-07
    • 2015-04-12
    相关资源
    最近更新 更多