首页 > 解决方案 > 节点中的 Cassandra 驱动程序包不会从 Cassandra 表中流式传输所有行

问题描述

我正在使用 Cassandra-driver 节点包(4.6.3)。我目前正在尝试将数据从 Cassandra 迁移到 SQL。大约有 450 000 条记录,尝试使用诸如 Altryx 之类的 ETL 工具,但这不起作用,因为存在不受支持的数据类型,例如地图和列表。因此尝试使用节点 JS 调度程序进行迁移。但问题是 Cassandra 的驱动程序并没有流过所有的记录。下面是代码库。

let output = [], params = []
let query = `select * from users`
cassandraDriver.client.eachRow(query, params, { prepare : false , fetchSize: 1000 }, function(n, rows) {
        output.push(1)
    }, async function(err, result){
        if(result.nextPage) {
             result.nextPage()
        } else if(output.length > 0) {
             console.log('Total size : ', output.length)
        }
    })

当我检查 Cassandra DB 的查询(从用户中选择计数(*))时,计数与我在上述情况下得到的输出值不同。数字似乎不匹配。看起来它不会流式传输 Cassandra 中存在的所有行。知道为什么会这样吗?是包裹的问题吗?我很想有一个替代品。真的打破我的头来解决这个问题。

不知道为什么节点驱动程序会给出随机计数。1000 fetch size 的倍数可以正常工作,但是最后一批少于 1000 有点搞砸了。例如,如果我在 Cassandra 中有 9602 条记录,我使用节点 Cassandra 驱动程序流式传输的记录可能在 9588 左右。不知道为什么不考虑最后 14 条记录。

标签: node.jscassandradatabase-migrationcassandra-driver

解决方案


问题可能在于您计算记录的方式。无界SELECT COUNT(*)执行全表扫描,不一定准确,正如我在本文中解释的那样——为什么 COUNT() 在 Cassandra 中不好

DataStax Bulk Loader (DSBulk) 有一个count命令可以有效地计算表中的记录。有关详细信息,请参阅 Brian Hess 的Counting with DSBulk博客文章。

此外,由于您正在将数据迁移到 SQL,DSBulk 允许您使用unload命令将数据从表中导出为 CSV 或 JSON 格式。它可供开源 Apache Cassandra 用户免费使用。以下是一些示例参考,可帮助您快速入门:

干杯!


推荐阅读