当在where子句中使用非索引列查询Cassandra时,Spark-Cassandra-Connector的官方文档指出:
要过滤行,可以使用Spark提供的过滤变换。然而,这种方法会导致从Cassandra获取所有行,然后由Spark进行过滤。
我有点困惑。例如,如果我有十亿行数据,结构如下:ID、City、State和Country,其中只有ID是索引的。如果我在where子句中使用City='Chicago',那么Spark首先会下载所有十亿行数据,然后再过滤出City='Chicago'的行吗?还是它会从Cassandra读取一些数据块,运行过滤器,存储符合条件的行,然后获取更多的数据块,再次获取符合条件的行,并将其设置为待处理的行…继续这个过程。如果在任何时候,RAM或磁盘存储空间不足,则删除/卸载/丢弃未匹配条件的数据,并获取新的数据块以继续该过程?
另外,有人能告诉我一个通用公式来计算保存十亿行数据中一个BigDecimal列和3个文本列需要多少磁盘空间吗?
要过滤行,可以使用Spark提供的过滤变换。然而,这种方法会导致从Cassandra获取所有行,然后由Spark进行过滤。
我有点困惑。例如,如果我有十亿行数据,结构如下:ID、City、State和Country,其中只有ID是索引的。如果我在where子句中使用City='Chicago',那么Spark首先会下载所有十亿行数据,然后再过滤出City='Chicago'的行吗?还是它会从Cassandra读取一些数据块,运行过滤器,存储符合条件的行,然后获取更多的数据块,再次获取符合条件的行,并将其设置为待处理的行…继续这个过程。如果在任何时候,RAM或磁盘存储空间不足,则删除/卸载/丢弃未匹配条件的数据,并获取新的数据块以继续该过程?
另外,有人能告诉我一个通用公式来计算保存十亿行数据中一个BigDecimal列和3个文本列需要多少磁盘空间吗?
.where(cql predicate)
(而不是.filter
)。其次,您对于allow filtering
是正确的(即使连接器可能仍然会遇到数据库错误-文档说Cassandra引擎不允许所有谓词)。最终,您作为数据所有者将决定运行查询的有效方式以及可以调整哪些内容(索引,或者在Spark中运行过滤器)... - ernest_k不是所有谓词都被Cassandra引擎所允许
的意思吗?请结合在where子句中查询未索引的列进行解释。 - Faraz