Phoenix系列 原子的Upsert

2021-09-07 21:41:19 字數 1785 閱讀 5535

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後面還有其他的語法來實現不同的功能:

如果操作同一行的多個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呼叫。

Phoenix系列 二級索引

phoenix使用hbase作為後端儲存,對於hbase來說,我們通常使用字典序的rowkey來快速訪問資料,除此之外,也可以使用自定義的filter來搜尋資料,但是它是基於全表掃瞄的。而phoenix提供的二級索引是可以避開全表掃瞄,是在hbase中快速查詢或批量檢索資料的另乙個選擇。下面的例子使...

山特ups電源城堡3C3 EX系列UPS

技術引數 城堡3c3 ex系列ups每一相由乙個單獨的pfc電路把交流轉換成直流再經過逆變器 inverter 將直流轉換成交流輸出。同時,提供一塊單獨的控制器,對pfc電路進行的實時控制和資料採集,以使整個系統更協調的執行 更及時的把系統狀態反饋給使用者。同時,通過對電池充電方式的控制,有效地延長...

山特ups電源城堡3C3 EX系列UPS

技術引數 城堡3c3 ex系列ups每一相由乙個單獨的pfc電路把交流轉換成直流再經過逆變器 inverter 將直流轉換成交流輸出。同時,提供一塊單獨的控制器,對pfc電路進行的實時控制和資料採集,以使整個系統更協調的執行 更及時的把系統狀態反饋給使用者。同時,通過對電池充電方式的控制,有效地延長...