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调用。

时间: 2024-10-12 18:51:19

Phoenix系列:原子的Upsert的相关文章

HBase笔记整理(二)

[TOC] HBase笔记整理(二) 逻辑结构 RowKey第一位 ColumnFamily ColumnQuiauer value(TimeStamps) Cell 物理结构 HMaster ----->NameNode 管理节点,用于管理HBase中的Table和Region的结构操作,比如用户增.删.修改表的操作. 在HBase集群中,可以启动多个HMaster,但是只能有一个HMaster属于Active的状态,通过ZooKeeper和其它standby状态的HMaster进程完成,一个

罗森伯格出席孟加拉Aamra 2014公众开放日活动

一年一度的由Aamra主办的网络建设巅峰会议"Aamra 2014公众开放日"活动,于2014年10月28日在孟加拉首都达卡莱克肖尔酒店隆重举办.本次吸引网络建设领域重量级专家.客户,合作伙伴等近百家品牌高层.业界主流媒体精英,齐聚一堂,共同见证了网络建设行业领先企业一年来的辛勤努力所放射出荣耀之光的一刻.受邀注册且参加会议的相关行业人员将近2000人次,罗森伯格作为德国知名品牌以及Aamra综合布线领域最紧密合作伙伴受邀参加了此次盛会. 高层合影 德国驻孟加拉大使馆代表为罗森伯格亲切

稀疏编码之字典学习

稀疏信号的一个最重要的部分就是字典A.那么选择A?怎么样选择才是合理? 一.字典的选择和学习 如何选择合适的字典,一种基本的方法是选择预定义的字典,如无抽样小波.可操纵小波.轮廓博.曲波,等等.近期很多学者提出来主要针对图像的字典,特别是类似于“卡通”的图像内容,假设分段平滑并具有平滑边界. 这些提出的字典附有详细的理论分析,能够对简单信号建立稀疏表示系数.一个典型的应用时M项近似衰减率——用M个最佳的非零系数表示信号. 另一种选择字典的方法是可调节的——通过在特定参数(连续或者离散的)控制下生

稀疏学习之设计字典

稀疏信号的一个最重要的部分就是字典A.那么选择A?怎么样选择才是合理? 一.字典的选择和学习 如何选择合适的字典,一种基本的方法是选择预定义的字典,如无抽样小波.可操纵小波.轮廓博.曲波,等等.近期很多学者提出来主要针对图像的字典,特别是类似于“卡通”的图像内容,假设分段平滑并具有平滑边界. 这些提出的字典附有详细的理论分析,能够对简单信号建立稀疏表示系数.一个典型的应用时M项近似衰减率——用M个最佳的非零系数表示信号. 另一种选择字典的方法是可调节的——通过在特定参数(连续或者离散的)控制下生

Java 多线程并发编程面试笔录一览

知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法 方式二:声明实现 Runnable 接口的类.该类然后实现 run 方法 推荐方式二,因为接口方式比继承方式更灵活,也减少程序间的耦合. 3.获取当前线程信息? Thread.currentThread() 4.线程的分类 线程分为守护线程.用户线程.线程初始化默认为用户线程. setDaemon(true) 将该线程标记为

学习mongo系列(十二)修改器($inc/$set/$unset/$push/$pop/upsert)

对于文档的更新除替换外,针对某个或多个文档只需要部分更新可使用原子的更新修改器,能够高效的进行文档更新.更新修改器是中特殊的键,用来指定复杂的操作,比如增加.删除或者调整键,还可能是操作数组或者内嵌文档.1.$inc > db.b.insert({"uid":"201603","type":"1","size":10})WriteResult({ "nInserted" : 1 }

Dynamics CRM 2015 Update 1 系列(2): Upsert API

Dynamics CRM 2015 Update1 推出了一个重量级的改变 "Upsert Request", 相信做过接口的朋友们都碰到过这样的场景,在向CRM写入数据的时候,因为无法确定该数据是否已经在CRM系统中存在,需要先做一次查询操作然后在进行后续的创建或更新操作.这样的数据写入流程无疑会大大的降低数据同步性能,因为在同步一条数据的同时,我们需要与服务器交互两次. 随着Upsert Request的推出,我们可以对这样的情况说再见了,我们把数据的检测逻辑交给系统进行处理,我们

Phoenix(sql on hbase)简介

Phoenix(sql on hbase)简介 介绍: Phoenix is a SQL skin over HBase delivered as a client-embedded JDBC driver targeting low latency queries over HBase data. Phoenix takes your SQL query, compiles it into a series of HBase scans, and orchestrates the runnin

Phoenix——实现向HBase发送标准SQL语句

写在前面一: 本文总结基于HBase的SQL查询系统--Salesforce phoenix 写在前面二: 环境说明: 一.什么是Phoenix 摘自官网: Phoenix是一个提供hbase的sql操作的框架,Phoenix是构建在HBase之上的一个SQL中间层.Phoenix完全使用Java编写,代码位于GitHub上,并且提供了一个客户端可嵌入的JDBC驱动.对于简单的低延迟查询,其性能量级为毫秒:对于百万级别的行数来说,其性能量级为秒.Phoenix并不是像HBase那样 用于map-