在更新 table 时保证完整 table 扫描?

Reading guarantees for full table scan while updating the table?

给定架构:

CREATE TABLE keyspace.table (
    key text,
    ckey text,
    value text
    PRIMARY KEY (key, ckey)
) 

...和 ​​Spark 伪代码:

val sc: SparkContext = ...
val connector: CassandraConnector = ...
sc.cassandraTable("keyspace", "table")
  .mapPartitions { partition =>
    connector.withSessionDo { session =>
      partition.foreach { row =>
        val key = row.getString("key")
        val ckey = Random.nextString(42)
        val value = row.getString("value")
        session.execute(s"INSERT INTO keyspace.table (key, ckey, value)" + 
          " VALUES ($key, $ckey, $value)")
      }
    }
  }

像这样的代码是否可以在单个应用程序(Spark 作业)中读取插入的值运行?我的问题的更一般化版本是令牌范围扫描 CQL 查询是否可以在遍历行时读取新插入的值。

是的,正如亚历克斯所写的那样是可能的 但我认为上面的代码不可能

因此,根据数据模型,table 按 ckey 升序排列

然而,有趣的部分是页面大小和预取的页面数量,因为默认情况下这是 1000 (spark.cassandra.input.fetch.sizeInRows),如果您不使用 42,那么唯一的问题可能会发生,但是更大的东西 and/or 执行者还没有寻呼

另外我认为你使用了不必要的嵌套,所以实现你想要的代码可能会被简化(毕竟 cassandraTable 会给你一个数据框)。

(我希望我明白你想读取每个分区(请注意你的情况下的分区是一个主键下的所有行 - “键”)并为此分区中的每一行(由 ckey 区分)生成新的一个(新的 ckey 只会用新的 ckey 复制值)- 这种代码的用例对我来说是个谜,但我希望它有一定的意义:-))