全部產品
Search
文件中心

ApsaraDB for HBase:查詢時Null 物件

更新時間:Jul 06, 2024

Ganos的資料查詢採用GeoTools Query對象來完成,Query中的查詢條件是通過構建CQL查詢語句來實現的。同時Query還有更多強大的功能,可以指定返回的屬性列、對某一屬性進行排序等。返回的資料是以SimpleFeatureCollection對象存在,可以通過迭代器遍曆所有的SimpleFeature,進而解析出需要的資料。

構造查詢條件

查詢條件也稱之為過濾器(Filter),採用CQL語言描述。CQL功能類似SQL語句的WHERE子句,根據這些條件可以過濾資料。

空間查詢

空間查詢支援如下謂詞,表中的Expression表示WKT表示的空間對象(點、線、面):
文法描述
INTERSECTS(Expression , Expression)判斷兩個空間對象是否相交,例如兩條道路是否相交。
DISJOINT(Expression , Expression)判斷兩個空間對象是否相離。
CONTAINS(Expression , Expression)判斷第一個空間對象是否包含第二個空間對象。
WITHIN(Expression , Expression)與CONTAINS謂詞相反,判斷第一個對象是否被第二個空間對象包含。
TOUCHES(Expression , Expression)判斷兩要素是否相接,即至少有一個公用點要素。
CROSSES(Expression , Expression)判斷兩個空間要素是否相交,要求僅有部分交集而不是完全包含。
BBOX(Expression , Xmin , Ymin , Xmax , Ymax [ , CRS ])空間對象[Expression]是否與[Xmin,Ymin,Xmax,Ymax]所組成的四邊形相交。

可選的CRS是空間參考系,包含SRS代碼的字串(例如,EPSG:1234。預設使用查詢圖層的CRS)。

  • 案例1:擷取某個空間範圍(120E,30N,130E,40N)所包含的空間對象(餐館、船舶、車輛等)。
    DataStore ds = DataStoreFinder.getDataStore(params);
    
    SimpleFeatureType schema=...
    
    String stFilter = "bbox(geom, 120,30,130,40)"
    
    Query query = new Query(schema, ECQL.toFilter(stFilter));
    
    SimpleFeatureCollection features=ds.getFeatureSource(schema).getFeatures(query);
  • 案例2:擷取周邊5公裡範圍內的所有車輛。
    • 首先將周邊5公裡的範圍構造成空間對象(面),假設為(46.9 48.9, 47.1 48.9, 47.1 49.1, 46.9 49.1, 46.9 48.9)。
    • 使用contains謂詞將所有對象過濾出來```String stFilter = “contains(‘POLYGON ((46.9 48.9, 47.1 48.9, 47.1 49.1, 46.9 49.1, 46.9 48.9))’, geom)

時空查詢

HBase Ganos支援的時間查詢謂詞如下,表中的Expression為時間列名,Time為字串。表示的時間UTC:

文法描述
Expression BEFORE Time時間在Time之前
Expression BEFORE OR DURING Time Period時間在Time Period之前或包含在Time Period之中
Expression DURING Time Period時間在Time Period之中
Expression DURING OR AFTER Time Period時間在Time Period之中或之後
Expression AFTER Time時間在Time Period之後
HBase Ganos支援的時間表達方式有多種:
文法描述
Time / Time 由起始時間和結束時間定義的區間
Duration / Time 在Time之前的時間區間
Time / Duration在Time之後的時間區間
樣本:如使用者想查詢位於(120E,30N,130E,40N)之中,時間介於2014-01-01T11:45:00與2014-01-01T12:15:00之間的車輛軌跡,那麼需要將空間查詢和時間查詢結合在一起,如下:
String stFilter = “bbox(geom, 120,30,130,40) AND dtg DURING 2014-01-01T11:45:00.000Z/2014-01-01T12:15:00.00
Query query = new Query(schema, ECQL.toFilter(stFilter));
SimpleFeatureCollection features=ds.getFeatureSource(schema).getFeatures(query);
說明
  • 比較子包括:=,<>,>,>=,<,<=,如要選取人口大於1500萬的城市,條件為PERSONS>15000000,其中PERSONS為人口數量的欄位,後面不再單獨說明。
  • BETWEEN表示從一個範圍到另一個範圍,如PERSONS BETWEEN 1000000 AND 3000000
  • 比較子支援文本值,可在運算子=的右側指定文本值,如CITY_NAME='Beijing',表示選擇北京市;也可以使用LIKE操作符,與SQL中的用法一樣,如CITY_NAME LIKE 'N%'會選擇所有以N開頭的城市。
  • 對兩個屬性進行比較,如MALE > FEMALE,選擇男性多於女性的城市。
  • 算術運算式可以使用 +, -, *, /構成,如過濾條件UNEMPLOY/(EMPLOYED + UNEMPLOY) > 0.07選擇所有失業率大於7%的城市。
  • 使用IN操作符,可選擇屬性在給定值範圍內的,與SQL用法相同,如ID IN ('cities.1', 'cities.12'),或尋找名字在給定值內的城市,可使用CITY_NAME IN ('Beijing','Shanghai', 'Guangzhou')
  • 可使用Geoserver中的任何過濾函數,如strToLowerCase(CITY_NAME) like '%m%',表示名字中包含m的城市,不區分M的大小寫。
  • 幾何過濾,使用BBOX,如BBOX(the_geom, -90, 40, -60, 45)表示選擇在(-90, 40, -60, 45)範圍內的城市。
String filter = “ name = ‘bob’”
val q = new Query(sft.getTypeName, ECQL.toFilter(filter))
SimpleFeatureCollection features=ds.getFeatureSource(schema).getFeatures(query);            
上例查詢中對name欄位的值做了限制。
### 指定返回列名使用者可以通過配置Query對象參數指定具體返回哪些列,
String[] returnFields=… //指定返回欄位名
Query query = new Query(schema, ECQL.toFilter(ecqlPredicate));
query.setPropertyNames(returnFields);
SimpleFeatureCollection features=ds.getFeatureSource(schema).getFeatures(query);
### 指定排序方式使用者可以通過構建SortBy對象參數指定具體返回哪些列,如:

String sortField=… //指定排序欄位名
FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();

SortBy[] sort = new SortBy[]{ff.sort(sortField, order)};

query.setSortBy(sort);
SimpleFeatureCollection features=ds.getFeatureSource(schema).getFeatures(query);