使用python

时间:2017-03-15 15:08:46

标签: python python-3.x cassandra datastax

我有一张包含以下型号的表格:

CREATE TABLE IF NOT EXISTS {} (
                user_id bigint ,
                pseudo text,
                importance float,
                is_friend_following bigint,
                is_friend boolean,
                is_following boolean,
                PRIMARY KEY ((user_id), is_friend_following)
            );

我还有一张包含种子的桌子。那些(20)用户是我的图表的起点。所以我选择他们的ID并在上面的表格中搜索他们的追随者和朋友,并从那里建立我的图表(networkX)。

def build_seed_graph(cls, name):
    obj = cls()
    obj.name = name
    query = "SELECT twitter_id FROM {0};"
    seeds = obj.session.execute(query.format(obj.seed_data_table))
    obj.graph.add_nodes_from(obj.seeds)
    for seed in seeds:
        query = "SELECT friend_follower_id, is_friend, is_follower FROM {0} WHERE user_id={1}"
        statement = SimpleStatement(query.format(obj.network_table, seed), fetch_size=1000)
        friend_ids = []
        follower_ids = []
        for row in obj.session.execute(statement):
            if row.friend_follower_id in obj.seeds:
                if row.is_friend:
                    friend_ids.append(row.friend_follower_id)
                if row.is_follower:
                    follower_ids.append(row.friend_follower_id)
        if friend_ids:
            for friend_id in friend_ids:
                obj.graph.add_edge(seed, friend_id)
        if follower_ids:
            for follower_id in follower_ids:
                obj.graph.add_edge(follower_id, seed)
    return obj

问题是构建图表所需的时间太长,我想优化它。 我的表'network_table'中有大约5百万行。

我想知道如果不使用where子句进行查询而只是对整个表执行单个查询,对我来说是否会更快?它会适合记忆吗?这是一个好主意吗?还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我怀疑真正的问题可能不是查询,而是处理时间。

  

我想知道如果不是使用where子句进行查询而只是对整个表执行单个查询,对我来说是否会更快?它会适合记忆吗?这是一个好主意吗?还有更好的方法吗?

如果启用分页(https://datastax.github.io/python-driver/query_paging.html - 使用fetch_size),对整个表执行单个查询应该没有任何问题。 Cassandra将返回fetch_size,并在从result_set中读取时获取其他结果。

请注意,如果表中有许多行与非种子相关,那么完整扫描可能会更慢,因为您将收到不包含“种子”的行

免责声明 - 我是建立ScyllaDB团队的一员 - 一个与Cassandra兼容的数据库。

ScyllaDB最近发表了一篇关于如何有效地进行并行http://www.scylladb.com/2017/02/13/efficient-full-table-scans-with-scylla-1-6/全面扫描的博客,该版本适用于Cassandra--如果完全扫描是相关的,你可以并行构建图形,这可能对你有所帮助

答案 1 :(得分:0)

您似乎可以删除最后2个if语句,因为您正在查看已经循环过一次的数据:

def build_seed_graph(cls, name):
    obj = cls()
    obj.name = name
    query = "SELECT twitter_id FROM {0};"
    seeds = obj.session.execute(query.format(obj.seed_data_table))
    obj.graph.add_nodes_from(obj.seeds)
    for seed in seeds:
        query = "SELECT friend_follower_id, is_friend, is_follower FROM {0} WHERE user_id={1}"
        statement = SimpleStatement(query.format(obj.network_table, seed), fetch_size=1000)
        for row in obj.session.execute(statement):
            if row.friend_follower_id in obj.seeds:
                if row.is_friend:
                    obj.graph.add_edge(seed, row.friend_follower_id)
                elif row.is_follower:
                    obj.graph.add_edge(row.friend_follower_id, seed)
    return obj

这也消除了您未使用的列表上的许多追加操作,并应加快此功能。