zoukankan      html  css  js  c++  java
  • Phoenix系列:原子的Upsert

    Phoenix的插入语句是Upsert,Update和Insert的组合语义。即,如果数据表中没有这条记录那么插入这条记录,如果有则更新。判断是否存在相同的数据是使用ON DUPLICATE KEY来验证的,这里的KEY就是建表时候的主键(PRIMARY KEY)。和Oracle的Merge Into以及MySQL的Insert …on duplicate key 是类似的功能。ON DUPLICATE KEY这个语法要到Phoenix 4.9之后才有。这个功能把HBase的Increment和CheckAndPut两个原子操作合在了一起。当Upsert语句被提交到服务端的时候,所要更新的行会被lock住,同时相关的列会被读取,ON DUPLICATE KEY语句会被执行。由于会锁住所在的行,所以会有一些性能损耗,但是这个损耗比较小,类似于HBase中Put和CheckAndPut的之间的性能差异。

    由于有了ON DUPLICATE KEY分句,如果行存在,那么VALUES后面的值将会为忽略。在ON DUPLICATE KEY后面还有其他的语法来实现不同的功能:

    • 如果分句是ON DUPLICATE KEY IGNORE 的话,那么这行就不会被Update。
    • 如果分句是ON DUPLICATE KEY UPDATE 的话,行就会被后面的Update语句更新,这个更新是获取了行级锁的。

    如果操作同一行的多个Upsert在同一时间被批量提交的话,服务端将会按顺序执行它们。所以无论自动提交是开还是关,都会得到一样的结果。

    下面列出了UPSERT的一些常用语法:

    UPSERT INTO TEST VALUES('foo','bar',3);
    UPSERT INTO TEST(NAME,ID) VALUES('foo',123);
    UPSERT INTO TEST(ID, COUNTER) VALUES(123, 0) ON DUPLICATE KEY UPDATE COUNTER = COUNTER + 1;
    UPSERT INTO TEST(ID, MY_COL) VALUES(123, 0) ON DUPLICATE KEY IGNORE;

    如果是4.9之前的版本的话,ON DUPLICATE KEY 分句是不存在的。只有上例的第一和第二种语法。如果原表中有数据重复的话,就会直接更新。

    和Oracle和MySQL一样,Phoenix也有Upsert Select语法。插入或更新的数据是另外一个查询结果集。插入或更新的列和查询结果集的列要一一匹配,如果不显式的列出列,那么查询结果集的列要和目标表的列的元数据保持顺序一致。如果auto commit开启的话,会在服务端就提交了,否则会缓存到客户端,等着显式提交的时候进行批量upsert。自动提交的话,可以通过客户端配置“phoenix.mutate.upsertBatchSize”指定大小,默认10000行/次。

    示例语法如下:

    UPSERT INTO test.targetTable(col1, col2) SELECT col3, col4 FROM test.sourceTable WHERE col5 < 100
    UPSERT INTO foo SELECT * FROM bar;

    最后,来说一下ON DUPLICATE KEY的一些限制。

    1. 主键不会被更新,它是创建新行的基础。

    2. 事务表不应该使用这个功能,因为当冲突发生时,原子的Upsert操作有可能已经被异常处理掉了。

    3. 不可变表不应该使用这个功能,因为不应该有数据更新不可变表。

    4. 如果要使用这个子句,在连接时,就不能设置CURRENT_SCN属性,因为除非最新的值正在被更新,否则HBase的操作不是原子的。

    5. 同一列在同一句语句中不应该被更新超过一次。

    6. ON DUPLICATE KEY 子句中不能有聚合或者序列。

    7. 虽然在列上的全局索引是支持原子化的更细你的,但是还是不推荐在全局索引表上使用这个子语句。因为当维护二级索引的时候,行会被锁定,这个子句胡产生一个RPC调用。

  • 相关阅读:
    poj 3243 Clever Y(BabyStep GiantStep)
    poj 2417 Discrete Logging
    poj 3481 Double Queue
    hdu 4046 Panda
    hdu 2896 病毒侵袭
    poj 1442 Black Box
    hdu 2815 Mod Tree
    hdu 3065 病毒侵袭持续中
    hdu 1576 A/B
    所有控件
  • 原文地址:https://www.cnblogs.com/haoxinyue/p/6750078.html
Copyright © 2011-2022 走看看