Tüm Ürünler
Search
Belge Merkezi

Lindorm:SQL kullanarak HBase tablolarına erişin

Son Güncelleme:Oct 07, 2026

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:


Veri türü


Karşılık gelen Java türü


Açıklama


HLONG


java.lang.Long


HBase sütununu Bytes.toBytes(long) yöntemiyle yazar.


HINTEGER


java.lang.Integer


HBase sütununu Bytes.toBytes(int) yöntemiyle yazar.


HSHORT


java.lang.Short


HBase sütununu Bytes.toBytes(short) yöntemiyle yazar.


HFLOAT


java.lang.Float


HBase sütununu Bytes.toBytes(float) yöntemiyle yazar.


HDOUBLE


java.lang.Double


HBase sütununu Bytes.toBytes(double) yöntemiyle yazar.


HSTRING


java.lang.String


HBase sütununu Bytes.toBytes(String) yöntemiyle yazar.


HBOOLEAN


java.lang.Boolean


HBase sütununu Bytes.toBytes(boolean) yöntemiyle yazar.

Not
  • 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.

Not

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.

  1. 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.

    Not

    ApsaraDB 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 adresi biç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:30020 ise, dönüştürülen bağlantı dizesi adresi jdbc:lindorm:table:url=http://ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30060 olur.

  2. dt tablosuna yazılan verilere sütun eşlemeleri eklemek için ALTER TABLE ifadesini 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;
    Not
    • Sü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.
  3. Geçerli şemanın eşleme ilişkilerini görüntülemek için DESCRIBE ifadesini kullanın.

    DESCRIBE dt;
    Not

    DESCRIBE TABLE söz dizimi hakkında daha fazla bilgi için DESCRIBE/SHOW/USE konusuna bakın.

  4. 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;
  5. (İ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.

    1. 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.

    2. İkincil dizini oluşturun:

      CREATE INDEX idx ON dt(f1:age) WITH (INDEX_COVERED_TYPE ='COVERED_DYNAMIC_COLUMNS');
    3. İ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;
    4. 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    |             |
      +---------------+-------------+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+
      Not
      • Dö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.

    5. İ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;
  6. İsteğe bağlı: Arama dizini oluşturun.

    1. Arama dizini oluşturun.

      CREATE INDEX search_idx USING SEARCH ON dt(f1:age,f1:name);
      Not

      SQL 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_ALL olarak ayarlamanız gerekir.

    2. 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         |                   |
      +--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+
  7. İ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;