我正在考虑使用带有scala和Akka的cassandra数据库进入Apache Spark,我一直试图找到问题的答案,我是否可以放弃现有的Cassandra驱动程序并仅使用Spark。它是否有通过分区键等查找记录的方法,或者只能占用整个表并对其进行过滤。我知道你可以过滤到一个记录,但这意味着迭代一个潜在的大规模表。我希望spart基本上发布CQL where子句,并允许我在我选择时只获取一行或一组行。如果这不可能,那么我需要坚持使用现有的驱动程序进行正常的数据库操作,并为分析提供支持。
答案 0 :(得分:1)
可以在Spark中使用CassandraRDD.where()发布CQL where子句
要过滤行,您可以使用Spark提供的过滤器转换。但是,此方法会导致从Cassandra获取所有行,然后通过Spark进行过滤。此外,某些CPU周期会浪费序列化和反序列化不包含在结果中的对象。为了避免这种开销,CassandraRDD提供了where方法,它允许您传递任意CQL条件来过滤服务上的行集
这是一个关于如何使用CassandraRDD.where()
的简单示例如果你有桌子
CREATE TABLE test.data (
id int PRIMARY KEY,
data text
);
您可以使用spark选择并使用主键进行过滤。
sc.cassandraTable("test", "data ").select("id", "data").where("id = ?", 1).toArray.foreach(println)
更多信息:https://github.com/datastax/spark-cassandra-connector/blob/master/doc/3_selection.md
但是在Cassandra驱动程序中,您可以更灵活地控制查询,而且Spark会比cassandra驱动程序花费更多的CPU,时间和内存。
正如RussS所说
“虽然这是正确的,并且where子句允许您运行单个分区请求,但这比直接通过Java驱动程序运行类似查询要贵几个数量级”