在更新 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 复制值)- 这种代码的用例对我来说是个谜,但我希望它有一定的意义:-))
给定架构:
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 复制值)- 这种代码的用例对我来说是个谜,但我希望它有一定的意义:-))