node.js - 节点中的 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 条记录。
解决方案
问题可能在于您计算记录的方式。无界SELECT COUNT(*)
执行全表扫描,不一定准确,正如我在本文中解释的那样——为什么 COUNT() 在 Cassandra 中不好。
DataStax Bulk Loader (DSBulk) 有一个count
命令可以有效地计算表中的记录。有关详细信息,请参阅 Brian Hess 的Counting with DSBulk博客文章。
此外,由于您正在将数据迁移到 SQL,DSBulk 允许您使用unload
命令将数据从表中导出为 CSV 或 JSON 格式。它可供开源 Apache Cassandra 用户免费使用。以下是一些示例参考,可帮助您快速入门:
- 博客 -使用 DSBulk 卸载数据
- Docs -卸载数据示例
- 已回答的问题 - community.datastax.com
干杯!
推荐阅读
- python - 使用 PCACompute2 计算特征值和特征向量
- python - 我避免多个flask-sqlalchemy db条目的方法
- c# - C# Interop:如何遍历 Word doc 中的引用?
- c# - 如何为音频剪辑的长度实例化对象
- cdi - WeldClientProxy 无法强制转换
- oracle11g - 错误 193 - Windows 10、64 位、MS Access、ODBC 驱动程序
- python - 使用 python 请求解析 HTML
- bash - 用sed中的文件内容替换文件名占位符
- java - 以下重载函数输出的原因是什么?
- dart - 如何在 Flutter 中发送带附件的电子邮件