【问题标题】:Cassandra query just return 5000 rowsCassandra 查询只返回 5000 行
【发布时间】:2020-09-24 12:27:08
【问题描述】:

我用这段代码从cassandra查询数据,结果只有5000行,但实际上数据库表有120000行,如何查询所有数据?

from cassandra import ConsistencyLevel
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
from cassandra.query import SimpleStatement
import pandas as pd

cluster = Cluster(contact_points=['192.168.2.4'],port=9042)
session = cluster.connect()

def testContectRemoteDatabase():
    contact_points = ['192.168.2.4']
    auth_provider = PlainTextAuthProvider(username='XXX', password='XX')
    cluster = Cluster(contact_points=contact_points, auth_provider=auth_provider)
    session = cluster.connect()
    cql_str = 'select * from DB1.mytable ;'
    simple_statement = SimpleStatement(cql_str, consistency_level=ConsistencyLevel.ONE)
    execute_result = session.execute(simple_statement, timeout=None)
    result = execute_result._current_rows
    cluster.shutdown()
    df = pd.DataFrame(result)
    df.to_csv('./my_test.csv', index=False, mode='w', header=True)

if __name__ == '__main__':
    testContectRemoteDatabase()

【问题讨论】:

    标签: python cassandra


    【解决方案1】:

    这是by design

    默认情况下,Session.default_fetch_size 控制每页将获取多少行。这可以通过在Statement 上设置fetch_size 来覆盖每个查询。默认情况下,每个页面最多包含 5000 行。

    将此设置为None 将禁用自动分页:

    simple_statement = SimpleStatement(
        cql_str, consistency_level=ConsistencyLevel.ONE, fetch_size=None)
    

    【讨论】:

    • 这很有帮助。谢谢!
    • @CR7 我需要指出进行全表扫描不是一个好主意。 Cassandra 专为 OLTP 工作负载而设计。如果您有一个节点和少量分区,您的代码可能 可以工作,但它不会扩展。您应该使用 Spark 进行分析查询。干杯!
    • @ErickRamirez 是对的。我认为 120K 记录没什么大不了,但取决于用例。
    • 我刚刚意识到您发布了stackoverflow.com/questions/64040650 并遇到了我上面提到的确切问题。我也在那里发布了更完整的答案。干杯!
    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    相关资源
    最近更新 更多