Geomesa HBase實踐篇 單列變多列

2021-10-03 15:46:50 字數 2397 閱讀 3669

目錄

1. 改造的背景

1.1 geomesa-hbase本身存在的問題

1.2 預期目標

2. 過程分析

3. 改造方法

3.1 切入點

3.2 修改過程

3.3 執行結果

4. 存在的問題

geomesa在向hbase寫入資料時,是通過htable和put物件來實現的。在寫入的時候,需要指定列族名、列名和cell的value值,而這些指定的內容都需要經過序列化才能進入到hbase當中。

在原生的geomesa當中,value值是將整個feature的所有資訊都封裝在一起,統一進行序列化的。雖然這樣能夠讓儲存的空間更小,避免了查詢多個欄位的問題,但是這樣的方式使得查詢沒有針對性,在進行查詢時,一些價值不大的資訊也會被查詢到,極大地占用了資源。

希望能夠通過一些原始碼級別的修改,找到geomesa與hbase進行互動的位置,將插入過程從單列寫入改造成為多列寫入,將整個的feature資訊儲存由儲存為乙個列轉變為分屬性儲存在不同的列中。以此來提公升查詢的針對性和效率。

在geomesa當中,主要負責插入資料是org.locationtech.geomesa.hbase.index.hbaseindexadapter類當中的createinsert方法,在這個方法當中,geomesa建立了put物件,乙個put物件對應乙個行鍵,這個行鍵是已經經過時空索引處理過後的二進位制陣列。

override protected def createinsert(row: array[byte], feature: hbasefeature): mutation =
然後這個put物件設定了若干個value,但是在預設情況下,這個feature物件中的value只有乙個物件,就是整個feature當中的所有資訊。而具體設定這些資訊的則是通過org.locationtech.geomesa.hbase.data.hbasefeature當中的values值來設定的。

lazy val values: seq[rowvalue] = serializers.map
從上面的**可以看出,values的型別是封裝了若干個rowvalue物件的序列,而在其內部設定時依然是單個rowvalue物件,也就是說,values封裝的是serializers遍歷之後的所有rowvalue物件。

在建立rowvalue物件時,其中設定列名的是第二個引數,預設情況下是hbasecolumngroups.default,這個引數存在於org.locationtech.geomesa.hbase.index.hbasecolumngroups類當中,預設情況下是「d」。也就是說預設情況下,寫入的資料只有乙個列,列名為「d」。

override val default: array[byte] = bytes.tobytes("d")
由上述分析可以看出,主要可以修改的點有三處:

首先,可以修改hbasecolumngroups類當中的default引數,這樣的話就可以修改列名。但是這樣的修改方式只是將列名修改過來了,雖然在hbase當中會顯示新的列名,但是本質上依然是整個feature進行序列化,整個儲存的過程。而且這樣的修改方式也會連帶地修改列族名,由修改過的實驗可以看出,在進行寫入操作時,列族名也會呼叫這個default引數。

其次還可以修改hbaseindexadapter類當中的createinsert方法,在進行feature.values的遍歷時,可以進行拆分。但是這種方式仍然是在rowvalue封裝好以後才進行遍歷的,本質上value值已經被序列化了,再進行拆分已經沒有價值了。

最好的方案是修改hbasefeature類當中的values,因為rowvalue是在這個函式內生成的,因此可以進行一些更為細緻的操作。

首先需要在values函式當中,判斷feature裡面的屬性儲存情況,以便抽取不同的資料,將這些資料分成不同的rowvalue進行封裝,儲存。

lazy val values: seq[rowvalue] = serializers.flatmap
在預設情況下,value當中將feature的所有資料都放在了一起,呈現出來的就是只有一列。

而經過修改以後,不同屬性的資料都已經被放在了不同的列當中。

最大的問題就是這樣的修改可能會導致資料無法通過原有geomesa來進行查詢的問題,因為原有geomesa依然是通過列族名「d」和列名「d」來進行查詢的。

還有乙個問題就是和原有序列化機制可能會出現衝突的問題。因為如果寫入的序列化機制和讀取的序列化機制產生衝突,就會報版本錯誤的問題。

GeoMesa Hbase命令列工具

hbase可以使用共有的其他命令,以下為hbase特有的命令 批量攝取 獲取資料並寫入到hfile hbase是以hfile的形式儲存的 適合批量載入到集群中。寫入離線hfile而不是直接寫入正在執行的集群可以減少集群上的負載,並避免昂貴的資料壓縮。批量攝取必須作為map reduce作業執行。因此...

線性回歸 實踐篇

總結了線性回歸的理論部分,下面我們以浦東塘橋的二手房資料來實踐線性回歸。1,資料獲取 2,資料過濾 爬到資料後,過濾了房間面積小於30平公尺,大於150平公尺的資料,總 大於800w的也過濾了。這些資料太小或者太大 3,一元線性回歸 x表示房子面積,y表示房價,使用正規方程組的方法計算。拿到 後執行...

實踐篇(五) KBQA Demo

作為實踐篇的最後一篇,我們將介紹如何用python完成乙個簡易的問答程式。下圖是demo的展示效果 查詢結果為空,回答 i don t know.不能理解問句,回答 i can t understand.本實現參考了王昊奮老師發布在openkg上的demo 基於refo的kbqa實現及示例 讀者也可...