我们使用aws keyspace服务实现了cassandra,并使用cassandra-driver for node。客户端工作正常,我们能够对数据执行创建和更新操作。但是,使用客户端运行一个简单的cql查询不会返回任何数据(空行)。
当我在aws仪表板上的cql编辑器上运行完全相同的查询时,它工作得很好,并返回所需的数据。
查询:
SELECT * FROM <TABLE_NAME> WHERE product_id = '<PRODUCT_ID>' ALLOW FILTERING
在aws仪表板的cql编辑器上运行相同的查询可以正常工作。
我注意到您在查询中使用ALLOW FILTERING
子句,这表明product_id
不是表的分区键。
如果查询的表没有分区键,请求的协调器必须联系集群中的所有节点才能获得请求的数据。查询很有可能超时等待所有节点的响应,因此没有返回任何数据。
我怀疑它可以在cqlsh中工作,因为它比Node.js驱动程序的默认超时更高。
你需要查看应用程序日志,从Node.js驱动程序中寻找警告或错误的线索。干杯!
👉请支持Apache Cassandra社区,将鼠标悬停在上面的cassandra
标签上,然后点击观察标签。🙏谢谢!
是在查询语句中使用部分分区键。键空间将过滤存储层上的行。扫描给定的金额后,它将返回给客户端。如果过滤条件没有找到结果,它将导致一个空页面。没有行的页。这是避免无限请求时间的安全措施。你可以继续遍历页面,直到到达迭代器的末端。
上面的方法在抓取前X行时很有用,但是对于全表扫描,我建议使用AWS Glue。
在下面的示例中,我们执行相同的产品查找,但使用Spark和Glue。在底层,Spark将对结果进行解析和分页。Glue将提供内存和计算资源。在此作业中,我们将结果导出到s3。一般的全表扫描可以是tb大小。这种架构将适用于小型或大型表,因为它使用无服务器资源。
Job.init(args("JOB_NAME"), glueContext, args.asJava)
val tableName = args("TABLE_NAME")
val keyspaceName = args("KEYSPACE_NAME")
val backupS3 = args("S3_URI")
val backupFormat = args("FORMAT")
val productId = args("PRODUCT_ID")
val tableDf = sparkSession.read
.format("org.apache.spark.sql.cassandra")
.options(Map( "table" -> tableName, "keyspace" -> keyspaceName))
.load()
.where(col("product_id") === productId)
tableDf.write.format(backupFormat).mode(SaveMode.ErrorIfExists).save(backupS3)
Job.commit()
您可以在这里找到完整的导出到s3示例和粘合创建脚本。