gpt4 book ai didi

hbase - 当要检查的行与 Put 的行不同时,checkAndPut 在什么情况下有用?

转载 作者:行者123 更新时间:2023-12-02 09:13:02 26 4
gpt4 key购买 nike

这是 checkAndPut API .

public boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put)

如果我的理解是正确的,row参数可以和put的行不同。但这为什么有用?我认为 checkAndPut 就像硬件架构中的 CompareAndSwap(CAS) 操作。 CAS 正在比较和设置单个变量。但是 checkAndPut 似乎支持对不同行的操作。这有帮助吗?或者我们需要保证 row 实际上与 put 的行相同?

最佳答案

checkAndPut() 是 CAS 的 HBase 变体,现在已弃用,应该改用 checkAndMutate。正如 javadoc 中指定的那样,API 自动检查行/系列/限定符值是否与预期值匹配。如果是,它会添加看跌期权。如果传递的值为空,则检查是否缺少列(即:不存在)。

让我们以列族为“cf1”的表“t1”为例,了解以下场景中的行为-

创建要插入的行

val put = new Put(Bytes.toBytes("r1"))
put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("q1"), Bytes.toBytes("v1"))

情况 1 - 表中不存在行、列族或列

Result - 插入一条新记录,res = true

var res = table.checkAndPut(Bytes.toBytes("r1"), Bytes.toBytes("cf1"), Bytes.toBytes("q1"), null, put)

案例 2 - 重新插入在案例 1 中插入的相同记录

结果 - 没有更新插入发生,因为该列已经存在,res = false

res = table.checkAndPut(Bytes.toBytes("r1"), Bytes.toBytes("cf1"), Bytes.toBytes("q1"), null, put)

案例 3 - 使用 cf1:q1 添加新的行键 r2,而 Put 仍设置为 rowkey = r1。

结果 - 没有更新插入发生,我们得到一个异常 - “Action 的 getRow 必须匹配传递的行”,这意味着在 checkAndPut 中设置的行键预计与 Put 中的相同,并且此 API 是按顺序检查行、列族和列限定符是否存在,并对照 Put 中指定的值

res = table.checkAndPut(Bytes.toBytes("r2"), Bytes.toBytes("cf1"), Bytes.toBytes("q1"), null, put)

案例 4 - 向行键 r1 和列 q1 添加新的列族 cf2,而 Put 仍设置为 rowkey = r1,列族 cf1。

结果 - 没有更新插入发生,我们得到一个异常 - “区域 t1,,1524474825488.a1f7efa76e78f38d64f95b63222cbfa8 中不存在列族 cf2。在表 't1' 中......”

res = table.checkAndPut(Bytes.toBytes("r1"), Bytes.toBytes("cf2"), Bytes.toBytes("q1"), null, put)

案例 5 - 我们没有检查 q1,而是在 checkAndPut() 中检查 q2 是否存在

结果 - 这里 API 将检查列 q2 是否存在,在我们的例子中不存在,因此相同的列 q1 将被更新,因为 Put 仍然设置为值 v1,只有时间戳/q1 的版本会改变,res = true

res = table.checkAndPut(Bytes.toBytes("r1"), Bytes.toBytes("cf1"), Bytes.toBytes("q2"), null, put)

案例 6 - 在之前的所有示例中,第 4 个参数都设置为 null,这里我们指定了实际值

结果 - checkAndPut 比较为 q1 指定的值与 Put,因为它比较等于插入发生,res = true

res = table.checkAndPut(Bytes.toBytes("r1"), Bytes.toBytes("cf1"), Bytes.toBytes("q1"), Bytes.toBytes("v1"), put)

案例 3 和案例 4 回答了您问题的最后一部分。

从可用性的角度来看,我认为这个 API 在同一行/列上可能发生大量并发更新的情况下很有用,为了避免任何冲突和过时的数据,我们读取验证然后写入,就像 OCC - https://en.wikipedia.org/wiki/Optimistic_concurrency_control#OCC_phases

要对多行/多列执行更新插入,应该使用 checkAndMutate。 [检查 - What is the difference between Hbase checkAndPut and checkAndMutate? ]

希望这对您有所帮助。

关于hbase - 当要检查的行与 Put 的行不同时,checkAndPut 在什么情况下有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49956923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com