LindormTable, HBase Shell veya Java için ApsaraDB for HBase API kullanılarak oluşturulan HBase tabloları üzerinde doğrudan SQL sorguları çalıştırmanıza olanak tanır; veri geçişi gerekmez. Sütun eşlemesi, şema bağımsız HBase depolama modeli ile Lindorm SQL arasında köprü kurarak mevcut verilerinizi standart SQL sözdizimini kullanarak filtrelemenize, dizinlemenize ve sorgulamanızı sağlar.
Önkoşullar
Geniş tablo altyapısı sürümü 2.6.4 veya üzeri olmalıdır. Mevcut sürümü görüntüleme veya yükseltme hakkında bilgi edinmek için LindormTable sürüm notları ve Lindorm örneğinin küçük altyapı sürümünü yükseltin konularına bakın.
Arka plan bilgileri
Lindorm geniş tablo altyapısı, Lindorm Shell veya HBase Java API kullanılarak oluşturulan veri tablolarına doğrudan erişebilir. Ancak HBase şema bağımsız olduğundan, HBase'deki sütunlar VARBINARY (Byte) türünde dinamik sütunlar olarak ele alınır. Dinamik sütunlar hakkında daha fazla bilgi için Dinamik sütunlar konusuna bakın. HBase API aracılığıyla yazılan sütunlarda Lindorm SQL'i kullanmak ve zengin veri türlerinden ve ikincil dizinlerden yararlanmak için ApsaraDB for HBase, HBase sütun eşlemesi ve HBase uyumlu türler sunar.
Söz dizimi
Lindorm SQL'de, bir HBase tablosunun özel sütun ailelerindeki niteleyicilere eşleme ekleyerek SQL sorgularını kolaylaştırabilirsiniz.
Eşleme ekleme ve kaldırma söz dizimi aşağıdaki gibidir:
dynamic_column_mapping_statement := ALTER TABLE table_name MAP DYNAMIC COLUMN
qualifer_definition hbase_type;
dynamic_column_unmapping_statement := ALTER TABLE table_name UNMAP DYNAMIC COLUMN
qualifer_definition_list;
qualifer_definition_list := qualifer_definition
(',' qualifer_definition)*
qualifer_definition := [ family_name ':' ] qualifier_name
hbase_type := HLONG | HINTEGER | HSHORT | HFLOAT |
HDOUBLE | HSTRING | HBOOLEAN
Aşağıdaki tabloda hbase_type tarafından belirtilebilen eşleme veri türleri açıklanmaktadır:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Geniş tablo altyapısı sürümü 2.5.1 veya üzeri, Rowkey için eşlemeyi destekler. Eşleme yöntemi diğer niteleyicilerle aynıdır. Eşleme nesnesi ROW olmalı ve ROW anahtar sözcüğü geri tırnak işaretleri (``) içine alınmalıdır.
Başka bir dil kullanıyorsanız, veriyi yazmadan önce kodlamak için Java sınıfı org.apache.hadoop.hbase.util.Bytes içindeki toBytes yöntemine bakın.
Java'daki Bytes.toBytes(String) UTF-8 kodlamasını kullanır. Başka bir dilde String'i Bytes'a dönüştürmek için toBytes kullanırken de UTF-8 kodlaması gerekir.
Veri hazırlığı
Aşağıdaki örnek HBase Java API'yi kullanır. Daha fazla bilgi için Uygulamalar geliştirmek için Java için ApsaraDB for HBase API'yi kullanın konusuna bakın.
Tablo oluşturma ve veri yazmanın diğer yöntemleri için Lindorm Shell ile LindormTable'a bağlanın konusuna bakın.
// Create the HBase sample table named "dt" with column family "f1"
try (Admin admin = connection.getAdmin()) {
HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("dt"));
htd.addFamily(new HColumnDescriptor(Bytes.toBytes("f1")));
admin.createTable(htd);
}
// Write data
try (Table table = connection.getTable(TableName.valueOf("dt"))) {
byte[] rowkey = Bytes.toBytes("row1");
byte[] family = Bytes.toBytes("f1");
Put put = new Put(rowkey);
// Write a String value, column name "name"
String name = "Some one";
put.addColumn(family, Bytes.toBytes("name"), Bytes.toBytes(name));
// Write an Int value, column name "age"
int age = 25;
put.addColumn(family, Bytes.toBytes("age"), Bytes.toBytes(age));
// Write a Long value, column name "time"
long timestamp = 1656675491000L;
put.addColumn(family, Bytes.toBytes("time"), Bytes.toBytes(timestamp));
// Write a Short value, column name "buycode"
short buycode = 123;
put.addColumn(family, Bytes.toBytes("buycode"), Bytes.toBytes(buycode));
// Write a Float value, column name "price"
float price = 12.3f;
put.addColumn(family, Bytes.toBytes("price"), Bytes.toBytes(price));
// Write a Double value, column name "price2"
double price2 = 12.33333;
put.addColumn(family, Bytes.toBytes("price2"), Bytes.toBytes(price2));
// Write a Boolean value, column name "isMale"
boolean isMale = true;
put.addColumn(family, Bytes.toBytes("isMale"), Bytes.toBytes(isMale));
// Write a null value. For all types, writing null is expressed as:
//put.addColumn(family, qualifier, null);
table.put(put);
}
Yordam
Aşağıdaki örnek, dt örnek tablosunu kullanarak bir HBase tablosuna SQL ile nasıl erişileceğini açıklamaktadır.
-
Lindorm-cli kullanarak geniş tablo altyapısına bağlanın. Daha fazla bilgi için Lindorm-cli ile geniş tablo altyapısına bağlanın ve kullanın konusuna bakın.
NotApsaraDB for HBase Gelişmiş Sürüm'de bir HBase tablosuna erişmek için SQL kullanıyorsanız, konsolda alınan adresi
jdbc:lindorm:table:url=http://Konsoldan alınan Java API adresibiçiminde oluşturun. Bağlantı noktasını 30020'den 30060'a değiştirin.Örneğin, konsoldan alınan bağlantı dizesi adresi
ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020ise, dönüştürülen bağlantı dizesi adresijdbc:lindorm:table:url=http://ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30060olur. -
dt tablosuna yazılan verilere sütun eşlemeleri eklemek için
ALTER TABLEifadesini kullanın.ALTER TABLE dt MAP DYNAMIC COLUMN `ROW` HSTRING, f1:name HSTRING, f1:age HINTEGER, f1:time HLONG, f1:buycode HSHORT, f1:price HFLOAT, f1:price2 HDOUBLE, f1:isMale HBOOLEAN;NotSütun eşlemesi eklemek, veri yazılıp yazılmadığına bakmaksızın sütunun veri türünü belirtir.
Sistem orijinal değeri şemaya göre Bytes'tan çözer. Bu nedenle, Lindorm SQL'e eşleme yaparken doğru veri türünü kullanmanız gerekir.
Aşağıdaki örnekte, f:age2 sütununun veri türünü HINTEGER olarak belirtirseniz sistem Bytes.toInt() yöntemini çağırır ve yanlış bir orijinal değer döndürür.
int age = 25; byte[] ageValue = Bytes.toBytes(age); put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age"), ageValue);// The data type of column f:age is INT, and it is mapped to HINTEGER in Lindorm SQL. String age2 = "25"; byte[] age2Value = Bytes.toBytes(age2); put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age2"), age2Value);// The data type of column f:age2 is STRING, and it is mapped to HSTRING in Lindorm SQL. -
Geçerli şemanın eşleme ilişkilerini görüntülemek için DESCRIBE ifadesini kullanın.
DESCRIBE dt;NotDESCRIBE TABLE söz dizimi hakkında daha fazla bilgi için DESCRIBE/SHOW/USE konusuna bakın.
-
dt tablosundaki verileri bir SQL ifadesi kullanarak sorgulayın.
SELECT * FROM dt LIMIT 1; SELECT * FROM dt WHERE f1:isMale=true LIMIT 1; SELECT * FROM dt WHERE f1:name='Some one' LIMIT 1; SELECT * FROM dt WHERE f1:time>1656675490000 and f1:time<1656675492000 LIMIT 1; -
(İsteğe bağlı) İkincil dizin oluşturun.
İkincil dizin, alan karşılığında zaman kazandırır. Birincil anahtar olmayan sorgu kalıplarının sorgu verimliliğini artırır ancak belirli bir depolama alanı kaplar. İkincil dizinlerin söz dizimi ve kullanım sınırları hakkında daha fazla bilgi için CREATE INDEX ve İkincil dizinler konularına bakın.
-
dt birincil tablosunun özelliklerini değiştirin.
ALTER TABLE dt SET 'MUTABILITY' = 'MUTABLE_LATEST';NotÖzel zaman damgaları kullanılıyorsa, birincil tablo özelliğini MUTABLE_ALL olarak ayarlayın.
-
İkincil dizini oluşturun:
CREATE INDEX idx ON dt(f1:age) WITH (INDEX_COVERED_TYPE ='COVERED_DYNAMIC_COLUMNS'); -
İsteğe bağlı: Geniş tablo altyapısı sürümünüz 2.6.3'ten önceyse ve ikincil dizin oluştururken async parametresini (eşzamansız dizin oluşturma) kullanırsanız, birincil tablodaki geçmiş verileri manuel olarak dizin tablosuna oluşturun. Oluşturma işlemi tamamlandıktan sonra geçmiş verileri ikincil dizini kullanarak sorgulayabilirsiniz. Oluşturma sırasında async parametresi kullanılmadıysa bu adımı atlayabilirsiniz.
BUILD INDEX idx ON dt; -
Dizini görüntüleyin.
SHOW INDEX FROM dt;Sonuç:
+---------------+----------- -+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+ | TABLE_SCHEMA | DATA_TABLE | INDEX_NAME | INDEX_STATE | INDEX_PROGRESS | INDEX_TYPE | INDEX_COVERED | INDEX_COLUMN | INDEX_TTL | +---------------+-------------+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+ | default | dt | idx | ACTIVE | 100% | SECONDARY | TRUE | f1:age,ROW | | +---------------+-------------+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+NotDönüş değerindeki INDEX_STATE Active olduğunda veri oluşturma işlemi tamamlanmıştır.
Dönüş değerindeki PINDEX_PROGRESS, dizin oluşturma ilerlemesini gösterir.
-
İsteğe bağlı: Yürütme planını görüntülemek ve ikincil bir dizinin isabet edip etmediğini kontrol etmek için EXPLAIN ifadesini kullanın.
EXPLAIN SELECT * FROM dt WHERE f1:age=23 LIMIT 1;
-
-
İsteğe bağlı: Arama dizini oluşturun.
-
Arama dizini oluşturun.
CREATE INDEX search_idx USING SEARCH ON dt(f1:age,f1:name);NotSQL kullanarak bir HBase tablosunda arama dizini oluştururken her bir arama dizini sütunu için aşağıdaki sınırlamalara dikkat edin:
Tüm arama dizini sütunları sütun eşlemesinde tanımlanmalıdır.
Desteklenen veri türleri, eşlenebilir veri türleriyle tutarlıdır. Daha fazla bilgi için Eşleme veri türleri konusuna bakın.
Bir arama dizini sütununun eşlemesini kaldıramazsınız. Aksi takdirde sorgu sonuçları hatalı olur.
HBase tablosuna yazmak için özel zaman damgaları kullanıyorsanız ve arama dizini oluşturmanız gerekiyorsa, tablonun MUTABILITY özelliğini
MUTABLE_ALLolarak ayarlamanız gerekir.
-
Dizinin başarıyla oluşturulup oluşturulmadığını kontrol edin.
SHOW INDEX FROM dt;Sonuç:
+--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+ | TABLE_SCHEMA | DATA_TABLE | INDEX_NAME | INDEX_STATE | INDEX_PROGRESS | INDEX_TYPE | INDEX_COVERED | INDEX_COLUMN | INDEX_TTL | INDEX_DESCRIPTION | +--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+ | default | dt | idx | ACTIVE | DONE | SECONDARY | DYNAMIC | f1:age,ROW | | | | default | dt | search_idx | BUILDING | N/A | SEARCH | NA | f1:age,f1:name | 0 | | +--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+
-
-
İsteğe bağlı: Sütun eşlemelerini kaldırın.
-
Bir sütun eşlemesini kaldırın. Aşağıda bir örnek verilmiştir:
ALTER TABLE dt UNMAP DYNAMIC COLUMN f1:isMale; -
Birden çok sütun eşlemesini kaldırın. Aşağıda bir örnek verilmiştir:
ALTER TABLE dt UNMAP DYNAMIC COLUMN f1:price2, f1:price2;
-