目錄git
import ( "context" "github.com/tsuna/gohbase" "github.com/tsuna/gohbase/hrpc" "github.com/tsuna/gohbase/filter" ) // 這裏host指的是zk連接 client := gohbase.NewClient(host) adminClient := gohbase.NewAdminClient(host)
tableName := "test" // 要建立的表名 families := map[string]map[string]string{ "cf": { // 列族名, 容許有多個列族, 如下參數全爲非必填參數 // 是否使用布隆過慮及使用何種方式 // ROW: 對 ROW,行鍵的哈希在每次插入行時將被添加到布隆。 // ROWCOL: 行鍵 + 列族 + 列族修飾的哈希將在每次插入行時添加到布隆 // NONE: "BLOOMFILTER": "ROW", // 數據保留的版本數, 若是不須要保留老版本數據, 能夠調低此參數來節約磁盤空間 "VERSIONS": "3", // 是否常駐內存 "IN_MEMORY": "false", // "KEEP_DELETED_CELLS": "false", // "DATA_BLOCK_ENCODING": "FAST_DIFF", // 默認是 2147483647 即:Integer.MAX_VALUE 值大概是68年 // 這個參數是說明該列族數據的存活時間,單位是s // 這個參數能夠根據具體的需求對數據設定存活時間,超過存過期間的數據將在表中不在顯示, // 待下次major compact的時候再完全刪除數據. // 注意的是TTL設定以後 MIN_VERSIONS=>’0’ 這樣設置以後,TTL時間戳過時後, // 將所有完全刪除該family下全部的數據,若是MIN_VERSIONS 不等於0那將保留 // 最新的MIN_VERSIONS個版本的數據,其它的所有刪除,好比MIN_VERSIONS=>’1’ 屆時將保留一個最新版本的數據, // 其它版本的數據將再也不保存。 "TTL": "2147483647", // 指定列族是否採用壓縮算法以及使用什麼壓縮算法NONE: 不使用壓縮 // SNAPPY/ZIPPY: 壓縮比22.2%, 壓縮172MB/s, 解壓409MB/s // LZO: 壓縮比20.5%, 壓縮135MB/s, 解壓410MB/s // GZIP: 壓縮比13.4%, 壓縮21MB/s, 解壓118MB/s "COMPRESSION": "NONE", // major compact的後保留的最少版本數 "MIN_VERSIONS": "0", // "BLOCKCACHE": "true", // "BLOCKSIZE": "65536", // "REPLICATION_SCOPE": "0", } } ct := hrpc.NewCreateTable(context.Background(), []byte(tableName), families) err := adminClient.CreateTable(ct)
rowKey := "18hd9j9aisdj9j9832dn9ooijd" // RowKey value := map[string]map[string][]byte{ "cf" { // 列族名, 與建立表時指定的名字保持一致 "col1": []byte("val1"), // 列與值, 列名可自由定義 "col2": []byte("val2"), "col3": []byte("val3"), } } putRequest, err := hrpc.NewPutStr(context.Background(), tableName, rowKey, value) res := client.Put(putRequest)
// 刪除整條記錄, value爲空便可 req, err := hrpc.NewDelStr(context.Background(), tableName, rowKey, value) res, err := client.Delete(req)
getRequest, err = hrpc.NewGetStr(context.Background(), tableName, rowKey) getRes, err = client.Get(getRequest)
// 範圍查詢 [startRow, stopRow), 查詢結果比較多時注意限制循環次數 getRequest, err := hrpc.NewScanRangeStr(context.Background(), tableName, startRow, stopRow) scan := client.Scan(getRequest) var res []*hrpc.Result for { getRsp, err := scan.Next() if err == io.EOF || getRsp == nil { break } if err != nil { log.Print(err, "scan.Next") } res = append(res, getRsp) }
var hf []func(hrpc.Call) error // 只查詢固定的列{cf: [col1, col2]} var Families map[string][]string hf = append(hf, hrpc.Families(Families)) // f值的獲取方式請繼續往下閱讀 hf = append(hf, hrpc.Filters(f)) getRequest, err = hrpc.NewGetStr(context.Background(), tableName, rowKey, hf...) getRequest, err := hrpc.NewScanRangeStr(context.Background(), tableName, startRow, stopRow, hf...)
比較過濾器不單獨使用, 需配合其它過濾器使用
value := "aaaaa" comparable := filter.NewByteArrayComparable([]byte(value)) var fc filter.Comparator // 二進制比較器(精確匹配) fc = filter.NewBinaryComparator(comparable) // LongComparator fc = filter.NewLongComparator(comparable) // 前綴比較 fc = filter.NewBinaryPrefixComparator(comparable) // BitComparator 字節比較 bitwiseOpInt := 1 // 1 AND, 2 OR, 3 XOR bitwiseOp := filter.BitComparatorBitwiseOp(bitwiseOpInt) fc = filter.NewBitComparator(bitwiseOp, comparable) // NullComparator fc = filter.NewNullComparator() // 正則比較 /* * 2: 忽略大小寫, 4: 忽略空白和註釋, * 8: 多行匹配,默認狀況下以行爲單位匹配 * 32:使 . 能匹配全部符號 * 更多值參見JAVA正則flags值 */ PatternFlags := 2 Charset := "utf-8" // 字符集, 用於將行鍵轉換爲字符串以便與正則進行匹配 Engin := "JAVA" // 正則引擎, JAVA, JONI fc = filter.NewRegexStringComparator(value, PatternFlags, Charset, Engine) // 子串比較 fc = filter.NewSubstringComparator(value) /* * 0: 小於, 1: 小於等於, 2: 等於, 3: 不等於, * 4: 大於等於, 5: 大於, 6: 無操做 */ CompareOp := 2 var f *filter.CompareFilter f = filter.NewCompareFilter(filter.CompareType(CompareOp), fc)
var f filter.Filter // 限制返回條數 f = filter.NewPageFilter(100) // 前綴過濾 f = filter.NewPrefixFilter([]byte("prefix")) // QualifierFilter f = filter.NewQualifierFilter(f.(*filter.CompareFilter)) // 隨機過濾 //設定一個機率值, 返回對應百分比的數據量(非嚴格執行) //設爲0則所有過濾, 設爲1則所有包含 f = filter.NewRandomRowFilter(0.8) // 使用比較過濾器過濾RowKey f = filter.NewRowFilter(f.(*filter.CompareFilter)) // TimestampsFilter f = filter.NewTimestampsFilter(r.Timestamps) // 使用比較過濾器過濾value f = filter.NewValueFilter(f.(*filter.CompareFilter)) // 範圍過濾, 後兩個參數分別表示返回結果是否包含startRow和stopRow f = filter.NewRowRange([]byte(startRow), []byte(stopRow), true, false) // 組合範圍過濾器 var rowRangeList *filter.RowRange f = filter.NewMultiRowRangeFilter(rowRangeList) //scan操做時不包含截止行, 使用此過濾器能夠將stopRow含在結果內 f = filter.NewInclusiveStopFilter([]byte(stopRow)) // FuzzyRowFilter var bbp []*filter.BytesBytesPair bbp = append(bbp, filter.NewBytesBytesPair([]byte, []byte)) f = filter.NewFuzzyRowFilter(bbp)
// 限制返回的列的數量 f = filter.NewColumnCountGetFilter(10) // 列分頁 f = filter.NewColumnPaginationFilter(limit, offset, []byte(columnOffset)) // 經過前綴過濾列 f = filter.NewColumnPrefixFilter([]byte(prefix)) // 列範圍匹配過濾器 // 後兩個參數控制是否包含邊界 f = filter.NewColumnRangeFilter([]byte(minColumn), []byte(maxColumn), true, false) // DependentColumnFilter f = filter.NewDependentColumnFilter(f.(*filter.CompareFilter), []byte(c.ColumnFamily), []byte(c.ColumnQualifier), true) //多列前綴匹配 f = filter.NewMultipleColumnPrefixFilter(sortedPrefix) // SingleColumnValueFilter f = filter.NewSingleColumnValueFilter([]byte(ColumnFamily), []byte(ColumnQualifier), compareOP, fc, FilterIfMissing, LatestVersionOnly) // SingleColumnValueExcludeFilter f = filter.NewSingleColumnValueExcludeFilter(f.(*filter.SingleColumnValueFilter)) //返回的數據不包括實際的單元值,只包含行鍵與列 f = filter.NewKeyOnlyFilter(true) //只返回每一行的第一列 f = filter.NewFirstKeyOnlyFilter() //經過設置一組須要匹配的列,只要匹配到任意一個列就會中止這一行的掃描操做進行下一行的掃描 f = filter.NewFirstKeyValueMatchingQualifiersFilter([][]byte)
f = filter.NewFamilyFilter(f.(*filter.CompareFilter))