Hbase增刪改查 關聯查詢 關係型資料庫轉化

2021-07-22 18:28:34 字數 1883 閱讀 2469

主要的目的是想直接通過hbase 將上面上面的mysql 替換成hbase, 這樣能夠對我們維護的負擔壓力減輕更多(調研), 實際過程中遇到了非常多的問題.

處理多表之間的問題的時候出現了很多問題. 主要是在列式資料庫中 對每一行的定義都是非結構化的, 只是對column family 進行嚴格的規定而已.這樣一來我們就沒有了我們需要的外來鍵/相關聯的, 更多的操作都是通過全表掃瞄.

對rowkey 的設計需要有非常高要求. 學習opentsdb 中rowkey的巧妙設計, 雖然丟棄了版本號的使用,但是能夠更加快的找到timeseries data,這也是乙個非常好的一種設計之一.

public

void

testput() throws ioexception

public

void

testdelete() throws ioexception

因為hbase底層實現是hdfs 在保證高併發的同時, 會犧牲一些一致性, 只需要保證了最終的一致性即可, 所以更新的操作可以看做為通過對某個行直接覆蓋寫, 同時利用時間戳來保證獲取到的資料是最新的.

查詢就是重點. 雖然看著沒有join 的操作.但是豐富的api能夠快速的實現join並且這個也是hbase的優勢. 列式儲存的優勢能夠在join 的時候體現出來.(具體從檔案儲存、索引、實現 需要認真考證)

4.1 通過rowkey 進行查詢

這個操作非常簡單, 直接知道rowkey然後就能夠提取出來所在的行

public void testscan() throws ioexception 

table.close();

}

4.2 通過正則來查詢rowkey

實現的方式是 在scan 的時候同時做filter (rowfilter)

//**片段

scan scan = new scan();

filter filter = new rowfilter(comparefilter.compareop.equal, new regexstringcomparator(login+"_"+"*"));

scan.setfilter(filter);

resultscanner scanner = table.getscanner(scan);

for (result res : scanner)

4.3 單列查詢

很多時候我們並不知道我們的rowkey是什麼, 但是我們知道我們現在要找到某一列的某乙個值.在哪一行. 這個時候就需要用到單列查詢singlecolumnvaluefilter

同理在hbase 裡面的所有操作都是通過scan & filter 找到, 如果沒有設計secondary index這樣scan 的結果在效率上是比較慢的.

filter filter = new singlecolumnvaluefilter(bytes.tobytes("info"),bytes.tobytes(column), comparefilter.compareop

.equal,bytes.tobytes(query));

整個重構專案寫了一半, 但是發現有非常多的問題, 從關係型資料庫遷移到hbase 不是說不可能, 但是又很多東西需要重新寫.比如一些最簡單的join count 等等都是人工的api 操作. 雖然可操作性非常高, 但是非常不利於我的快速迭代和開發, 維護成本也不低. 另外關係型資料庫有很多非常友好和成熟的操作 不是hbase所擅長的, 尤其是事務型資料.

之後應該也會有更多的對hbase方面的學習,會一直更加認真的寫一些分享.

寫總結不是一件容易的事情.

hbase 增刪改查

兩篇可以參考的文章,講的不錯 hbase web操作 訪問位址 http hmaster 60010,hmaster的ip配置在 hbase home conf hbase site.xml中 ip對映成主機名,在env hosts中配置 在windows系統中的c windows system32...

gorm增刪查改json gorm 關聯查詢請教

有如下兩張表 type activity record struct select activity records.id,activity records.activity config id find list 列印的 sql 語句 2020 07 06 09 54 57 1.00ms sele...

HBase命令 三 增刪改查

新增 語法 put 新增或者覆蓋資料 put 表名 鍵名 列名 不是列簇名 值 指定的列名下單元格有值就覆蓋.沒有值就建立.所以hbase的新增資料和修改資料都是put語句.最後的時間戳可以不寫.預設為系統時間,如果要寫.切記不可使用引號括起來 hbase shell put mytable wos...