Tüm Ürünler
Search
Belge Merkezi

MaxCompute:Hologres harici tablolar

Son Güncelleme:Oct 04, 2026

Bu konuda, bir Hologres harici tablosunun nasıl oluşturulacağı anlatılmaktadır. Konuda; bir Hologres veri kaynağının nasıl belirtileceği, RAM rolü veya hizmet bağlantılı rol aracılığıyla erişimin nasıl verileceği, hedef tablonun nasıl eşleneceği ve CREATE TABLE ifadesinde JDBC sürücü ayarlarının nasıl yapılandırılacağı açıklanmaktadır.

Genel Bakış

Hologres; PostgreSQL protokolü ile uyumlu olan ve MaxCompute ile sorunsuz şekilde entegre edilen gerçek zamanlı etkileşimli analitik bir veri ambarıdır. MaxCompute içinde Hologres harici tabloları oluşturarak PostgreSQL JDBC sürücüsü ve Hologres RAM rolü kimlik doğrulaması yardımıyla bir Hologres veri kaynağını sorgulayabilirsiniz. Bu yöntem yedekli depolamayı ortadan kaldırır, veri içe veya dışa aktarmaya gerek kalmaz ve hızlı sorgu sonuçları sunar.

Sınırlamalar

  • Veri işleme (DML)

    • MaxCompute, Hologres harici tablolar üzerinde UPDATE veya DELETE işlemlerini desteklemez.

    • Hologres harici tablolar INSERT OVERWRITE ifadesini desteklemez.

      Bir Hologres tablosundaki verileri MaxCompute verileriyle üzerine yazmak için Hologres'te bir INSERT OVERWRITE ifadesi çalıştırın. Bu ifade, bir MaxCompute tablosuyla eşlenen Hologres'teki bir harici tablodan veri okur. Daha fazla bilgi için bkz. INSERT OVERWRITE.

  • Veri yazma riski

    Bir Hologres harici tabloya büyük hacimli veri yazdığınızda paralel yazma işlemleri kullanılır. Nadir durumlarda bu işlemlerden biri veriyi yeniden yazabilir ve bu durum veri çoğalmasına neden olabilir.

  • Bölümler

    Hologres ve MaxCompute'deki bölümlenmiş tablolar birbirleriyle doğrudan eşleşmez. Hologres harici tablolar bölümleri desteklemez. Ancak doğrudan okuma modunda, bir Hologres bölümlenmiş üst tablosuyla eşlenen bir Hologres harici tablosunu sorguladığınızda ve sorgu filtresi altta yatan bölümlenmiş alt tablonun bölüm sütununa ilişkin bir koşul içeriyorsa bölüm ayıklama uygulanır.

  • Hologres harici tablolar cluster niteliğini desteklemez.

  • Hologres harici tablolar bir Hologres Dinamik Tablo ile eşlemeyi desteklemez.

  • Desteklenen veri türleri listesine bakın.

Hologres harici tablo oluşturma

Bir Hologres harici tablosunu Hologres için RAM rolü yetkilendirmesi veya hizmet bağlantılı rol yetkilendirme modu kullanarak oluşturabilirsiniz.

Dikkat Edilecek Hususlar

Harici tablo oluşturma yönergeleri

  • Hologres örneğiniz dış erişim için bir IP izin listesi kullanıyorsa bunu desteklenen bir sürüme yükseltin:

    • RAM rolü yetkilendirme modu için Hologres V3.2 veya sonraki bir sürüme yükseltin.

    • Hizmet bağlantılı rol yetkilendirme modu için Hologres V2.0.28 veya sonraki bir sürüme yükseltin.

    Yükseltmeden sonra Hologres, MaxCompute hizmet kimliğine veya hizmet bağlantılı role dayalı olarak MaxCompute düğüm IP'lerine otomatik olarak güvenir. Artık MaxCompute esnek düğüm IP adreslerini Hologres örneğinizin IP izin listesine eklemeniz gerekmez.

  • Hologres'teki hem üst hem de alt tabloları bir harici tabloyla eşleyebilirsiniz. Ancak bir üst tabloyla eşlenen bir harici tabloya yalnızca okuma yapabilir, yazma işlemi gerçekleştiremezsiniz.

  • Bir Hologres harici tabloya veri yazarken INSERT ON CONFLICT (UPSERT) mekanizması desteklenmez. Hologres kaynak tablosunda bir birincil anahtar varsa birincil anahtar çakışmalarına neden olan veri yazmaktan kaçının.

  • Tablo adları ve sütun adları büyük/küçük harfe duyarlı değildir. Tabloları ve sütunları oluştururken veya sorgularken büyük/küçük harf duyarlılığını zorlayamazsınız.

Şema uyumluluğu

Hologres kaynak tablo şeması harici tablo şemasıyla eşleşmiyorsa aşağıdaki hususlara dikkat edin:

  • Eşleşmeyen sütun sayısı: Kaynak tabloda harici tablodan daha az sütun varsa veri okuma işlemi column "xxx" does not exist gibi bir hata ile başarısız olur. Kaynak tabloda harici tablodan daha fazla sütun varsa ek sütunlar yoksayılır.

  • Eşleşmeyen sütun türleri: MaxCompute, bir Hologres kaynak tablosundan gelen STRING sütununu harici tablodaki bir INT sütunuyla eşleyemez. Bir INT sütununun bir STRING sütunuyla eşlenmesi desteklenir ancak önerilmez.

Sözdizimi

Bir harici tablo oluştururken CREATE TABLE DDL ifadesinde StorageHandler'ı belirtin, RAM rolü yetkilendirmesini veya hizmet bağlantılı rol yetkilendirmesini yapılandırın ve Hologres veri kaynağına erişmek için JDBC bağlantı URL'sini sağlayın.

RAM rolü modu

Tam kod örneği için bkz. Hologres harici tablo oluşturma (RAM rolü yetkilendirme modu).

CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>(
  <col1_name> <data_type>,
  <col2_name> <data_type>,
  ......
)
stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
WITH serdeproperties (
  'odps.properties.rolearn'='<role_arn>')
location 'jdbc:postgresql://<endpoint>:<port>/<database>?
  ApplicationName=MaxCompute&[currentSchema=<schema>&]
  [useSSL={true|false}&]table=<holo_table_name>/' 
tblproperties (
  'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 
  'odps.federation.jdbc.target.db.type'='holo',
-- When Hologres and MaxCompute column names differ, add the odps.federation.jdbc.colmapping parameter to map columns. 
-- This parameter can be omitted if column names are identical.
  ['odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, 
                                     <table_column2>:<source_column2>,...']
);

Hizmet bağlantılı rol modu

Tam kod örneği için bkz. Hologres harici tablo oluşturma (hizmet bağlantılı rol yetkilendirme modu).

Hizmet bağlantılı rol yetkilendirme modu, aynı RAM kullanıcısının manuel yetkilendirme gerektirmeden hem MaxCompute hem de Hologres'teki yetkili tablolara erişmesine olanak tanır. Bu mod ayrıca Hologres IP izin listesi özelliğini de destekler.

-- Create an external table
CREATE EXTERNAL TABLE [IF NOT EXISTS]  <table_name>(
  <col1_name> <data_type>,
  <col2_name> <data_type>,
  ......
)
STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
LOCATION 'jdbc:postgresql://<endpoint>:<port>/<database>?
  ApplicationName=MaxCompute&[currentSchema=<schema>&]
  [useSSL={true|false}&]table=<holo_table_name>/' 
tblproperties (
  'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 
  'odps.federation.jdbc.target.db.type'='holo',
-- When Hologres and MaxCompute column names differ, add the odps.federation.jdbc.colmapping parameter to map columns. 
-- This parameter can be omitted if column names are identical.
   ['odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, 
                                      <table_column2>:<source_column2>,...']
);

Parametreler

Parametre ayrıntılarını görüntülemek için tıklayın

Parametre

Gerekli

Açıklama

IF NOT EXISTS

Hayır

  • IF NOT EXISTS seçeneğini belirtmezseniz ve aynı ada sahip bir tablo zaten varsa hata raporlanır.

  • IF NOT EXISTS belirtirseniz aynı ada sahip bir tablonun var olup olmadığından bağımsız olarak ifade başarılı olur. Şeması oluşturmakta olduğunuz şemadan farklı olsa bile mevcut tablonun meta verileri değiştirilmez.

table_name

Evet

MaxCompute'de oluşturulacak Hologres harici tablosunun adı.

col_name

Evet

Hologres harici tablosundaki bir sütunun adı.

data_type

Evet

Hologres harici tablosundaki bir sütunun veri türü.

STORED BY

Evet

Hologres harici tablosunun nasıl sorgulanacağını tanımlayan StorageHandler.

JDBC bağlantı yöntemini kullanmak için değeri com.aliyun.odps.jdbc.JdbcStorageHandler olarak ayarlayın.

role_arn

Evet

Bu parametre, RAM rolü yetkilendirme modunda bir Hologres harici tablosu oluştururken gereklidir. Belirtilen RAM rolünün ARN'si. Harici tablolar oluştururken kimlik doğrulamayı yapılandırmak için kullanılır. RAM rolü oluşturma ve izin verme hakkında daha fazla bilgi için bkz. Hologres RAM rolü yetkilendirmesi.

  1. Log in to the RAM console.

  2. In the left navigation bar, select Identities > Roles.

  3. On the Roles page, click the target Role Name to go to the role details page.

  4. In the Basic Information section, you can obtain the ARN.

Hayır

Bu parametre hizmet bağlantılı rol modunda gerekli değildir.

LOCATION

Evet

Hologres örneği için JDBC bağlantı dizesi. Aşağıdaki parametreleri içerir:

  • endpoint: Gerekli. Hologres örneğinin klasik ağ alan adı.

    Önemli

    Şu anda Hologres'e yalnızca klasik ağ üzerinden bağlanabilirsiniz. VPC üzerinden bağlantılar desteklenmemektedir.

  • port: Gerekli. Hologres örneğinin ağ bağlantı noktası.

    1. Log on to the Hologres management console. In the upper-left corner, select a region.

    2. In the navigation pane on the left, click Instances.

      On the Instances page, click the name of the target instance.

    3. In the Network Information section, find the classic network domain name and port of the Hologres instance.

  • database: Gerekli. Hedef Hologres veritabanının adı. Daha fazla bilgi için bkz. CREATE DATABASE.

  • ApplicationName: Gerekli. Varsayılan değer MaxCompute'dir. Bu değeri değiştirmeniz gerekmez.

  • schema: İsteğe bağlı. Tablo adı veritabanında benzersizse veya kaynak tablo varsayılan şemadaysa bu parametreyi atlayabilirsiniz. Daha fazla bilgi için bkz. CREATE SCHEMA.

  • holo_table_name: Gerekli. Hologres kaynak tablosunun adı. Daha fazla bilgi için bkz. CREATE TABLE.

  • useSSL:İsteğe bağlı. Alibaba Cloud klasik ağı üzerinden MaxCompute ile Hologres arasındaki erişim için güvenlik yapılandırmasını belirtir.

    • true: Güvenli şifreli bir bağlantı kullanmak için SSL'yi etkinleştirir.

    • false: SSL'yi devre dışı bırakır.

tblproperties

Evet

  • mcfed.mapreduce.jdbc.driver.class: Gerekli.

    Hologres veritabanına bağlanmak için kullanılan sürücü. Değer org.postgresql.Driver olmalıdır.

  • odps.federation.jdbc.target.db.type: Gerekli.

    Veritabanı türü. Değer holo olmalıdır.

  • odps.federation.jdbc.colmapping: İsteğe bağlı.

    Harici tablo sütunları ile Hologres kaynak tablo sütunları arasındaki eşleme.

    • Bu parametre yapılandırılmazsa sütunlar kaynak ve harici tablolar arasında ada göre eşlenir.

    • Bu parametreyi yalnızca bazı sütunlar için yapılandırırsanız belirtilen sütunlar tanımlandığı gibi eşlenirken kalan sütunlar ada göre eşlenir. Otomatik olarak eşlenen bu sütunların adları veya veri türleri eşleşmezse hata oluşur.

    • Bir Hologres sütun adı büyük harf içeriyorsa sütun adını çift tırnak içine alın (""). Biçim: MaxCompute_column_1:"Hologres_column_1"[,MaxCompute_column_2:"Hologres_column_2",...].

      Not

      Hologres kaynak tablosunda c bool, map_B string, a bigint sütunlarının ve harici tabloda a bigint, x string, c bool sütunlarının bulunduğunu varsayalım.

      colmapping yapılandırması 'x: "map_B"' olarak ayarlanırsa Hologres verilerini başarıyla eşleyebilir ve sorgulayabilirsiniz.

  • mcfed.mapreduce.jdbc.input.query: İsteğe bağlı.

    Bir Hologres veri kaynağı tablosundan veri okur. Harici tablonun sütunları, sütun adları ve veri türleri kaynak tablonunkilerle (veya takma ad kullanılıyorsa takma adla) eşleşmelidir. select_sentence biçimi SELECT xxx FROM <holo_database_name>.<holo_schema_name>.<holo_table_name> şeklindedir.

  • mcfed.holo.read.freshness.seconds:İsteğe bağlı.

    • Hologres'i doğrudan okuma modunda okurken freshness parametresini kullanarak veri tazeliğini kontrol edebilirsiniz. Bu, oluşturulan anlık görüntünün en azından now() - freshness zamanına kadar olan tüm verileri içerdiği anlamına gelir; bu da küçük dosya oluşumunu azaltabilir ve sorgu performansını bir ölçüde iyileştirebilir.

    • Varsayılan değer: 60. Birim: saniye. Değer aralığı: ≥ -1 ve ≤ 86400.

    • Bu parametreyi SQL ifadesinden önce SET odps.external.holo.read.freshness.seconds = <num>; ekleyerek oturum düzeyinde de ayarlayabilirsiniz.

    • Parametre yapılandırma önceliği: oturum düzeyi > tblproperties (tablo) düzeyi > Hologres GUC varsayılan değeri (60 saniye).

Örnekler

Adım 1: Hologres verilerini hazırlama

Bir Hologres veritabanınız, tablonuz ve test veriniz varsa bu adımı atlayabilirsiniz.

Hologres veritabanı oluşturma

  1. Hologres yönetim konsolu üzerinde oturum açın. Sol üst köşeden bir bölge seçin.

  2. Soldaki gezinme bölmesinde Instances seçeneğine tıklayın.

  3. Bir örneğiniz yoksa önce bir Hologres örneği satın almanız gerekir.

    Instances sayfasında hedef örneğin adına tıklayın.

  4. Örnek ayrıntıları sayfasında Connect to Instance seçeneğine tıklayın.

  5. Metadata Management sekmesine tıklayın.

    Create Database seçeneğine tıklayın, görünen iletişim kutusunda Database Name değerini girin ve diğer parametreleri varsayılan ayarlarında bırakın.

Hologres tablosu oluşturma

  1. Örnek ayrıntıları sayfasında Connect to Instance seçeneğine tıklayın.

  2. SQL Editor sekmesine tıklayın.

  3. Bir tablo oluşturmak ve veri eklemek için aşağıdaki ifadeleri çalıştırın:

    CREATE TABLE IF NOT EXISTS holo (
        id   INT PRIMARY KEY,
        name TEXT
    );
    INSERT INTO holo (id, name) VALUES
        (1, 'kate'),
        (2, 'mary'),
        (3, 'bob'),
        (4, 'tom'),
        (5, 'lulu'),
        (6, 'mark'),
        (7, 'haward'),
        (8, 'lilei'),
        (9, 'hanmeimei'),
        (10, 'lily'),
        (11, 'lucy');
    SELECT * FROM holo ORDER BY id;

Adım 2: Hologres harici tablo oluşturma

RAM rolü

Bu modda harici tablonun oluşturucusu Hologres veri erişim izinlerine sahip bir RAM rolünü harici tablo tanımına yerleştirir. Diğer MaxCompute kullanıcılarına daha sonra bu harici tablo üzerinde izin verilebilir. Bir kullanıcı harici tabloya eriştiğinde sistem verileri eşlenen Hologres tablosundan almak için bağlı RAM rolünü kullanır.

Hologres, bir veritabanı örneğine hesaplar arası bir RAM rolü eklemeyi desteklemez. Bu nedenle RAM rolü modundaki Hologres yalnızca aynı hesaptaki RAM rollerini destekler. Benzer şekilde MaxCompute bir harici tablo veya harici şema kullanarak Hologres'e erişirken yalnızca aynı hesaptaki RAM rolleri desteklenir.

Ön Koşullar

  1. MaxCompute istemcisini yükleyip yapılandırdınız.

  2. Hologres harici tablosunu oluşturmak istediğiniz hedef bir MaxCompute projeniz vardır.

    Daha fazla bilgi için bkz. MaxCompute projesi oluşturma.

  3. Bir RAM rolü oluşturdunuz ve yetkilendirdiniz. Daha fazla bilgi için bkz. Hologres için RAM Rolü Yetkilendirme.

MaxCompute'de harici tablo oluşturma

  1. MaxCompute istemcisinde oturum açın ve hedef MaxCompute projenize geçiş yapın.

  2. Hologres harici tablosunu oluşturmak için aşağıdaki ifadeyi çalıştırın.

    Aşağıdaki örnekte Adım 1: Hologres verilerini hazırlama bölümünde hazırlanan veriler kullanılmıştır:

    • Hologres veritabanı adı: holo_external_test.

    • Hologres veritabanı şeması: public.

    • Hologres tablo adı: holo.

    • Hologres klasik ağ uç noktası: hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80.

    CREATE EXTERNAL TABLE IF NOT EXISTS my_table_holo_jdbc
    (
      user_id bigint,
      user_name string
    )
    stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' 
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::139699392458****:role/<role name>')
    location 'jdbc:postgresql://hgprecn-cn-oew210ut****-cn-<region>-internal.hologres.aliyuncs.com:80
      /<holo database name>?ApplicationName=MaxCompute
      &currentSchema=public&table=<table name>/'
    tblproperties (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo',
    -- When the column names of the Hologres source table differ from those of the Hologres external table,
    -- add the odps.federation.jdbc.colmapping parameter for column mapping.
    -- This parameter can be omitted when the column names are identical.
      'odps.federation.jdbc.colmapping'='user_id:id,user_name:name'
    );
  3. Yeni oluşturulan harici tabloyu kullanarak Hologres kaynak tablosunu sorgulamak için aşağıdaki komutları çalıştırın.

    -- The following properties are required to access Hologres external tables.
    SET odps.sql.split.hive.bridge=true;
    SET odps.sql.hive.compatible=true;
    SET odps.table.api.enable.holo.table=true; --Enable JDBC direct read access 
    -- Query data from the Hologres external table.
    SELECT * FROM my_table_holo_jdbc limit 10;
    -- The command returns the following result.
    +------------+------------+
    | user_id    | user_name  |
    +------------+------------+
    | 9          | hanmeimei  | 
    | 4          | tom        | 
    | 7          | haward     | 
    | 2          | mary       | 
    | 5          | lulu       | 
    | 8          | lilei      | 
    | 10         | lily       | 
    | 1          | kate       | 
    | 6          | mark       | 
    | 11         | lucy       | 
    +------------+------------+
  4. Verileri Hologres ile değiştirmek ve birleşik analiz gerçekleştirmek için Hologres harici tablosunu kullanın.

    • Hızlandırılmış analiz ve çevrimiçi hizmetler için MaxCompute'de işlenen verileri harici tablo kullanarak Hologres'e yazın.

      -- The following properties are required to access Hologres external tables.
      SET odps.sql.split.hive.bridge=true;
      SET odps.sql.hive.compatible=true;
      SET odps.table.api.enable.holo.table=true; --Enable JDBC direct read access 
      -- Insert data into the Hologres external table.
      INSERT INTO my_table_holo_jdbc VALUES (12,'alice');
      -- Query data from the Hologres external table.
      SELECT * FROM my_table_holo_jdbc;
      -- The command returns the following result.
      +------------+------------+
      | user_id    | user_name  |
      +------------+------------+
      | 9          | hanmeimei  | 
      | 4          | tom        | 
      | 7          | haward     | 
      | 2          | mary       | 
      | 5          | lulu       | 
      | 12         | alice      | 
      | 8          | lilei      | 
      | 10         | lily       | 
      | 1          | kate       | 
      | 11         | lucy       | 
      | 6          | mark       | 
      | 3          | bob        | 
      +------------+------------+
    • Gerçek zamanlı güncellemeleri desteklemek amacıyla sık güncellenen boyut tablolarını Hologres'te saklayın. MaxCompute, boyut tablosuna bir harici tablo kullanarak erişir ve birleşik analiz için MaxCompute'deki bir gerçek tablo ile birleştirir.

      -- The following properties are required to access Hologres external tables.
      SET odps.sql.split.hive.bridge=true;
      SET odps.sql.hive.compatible=true;
      -- Create a MaxCompute internal table.
      CREATE TABLE holo_test AS SELECT * FROM my_table_holo_jdbc;
      -- Join the MaxCompute internal table with the Hologres external table for analysis.
      SELECT * FROM my_table_holo_jdbc t1 INNER JOIN holo_test t2 ON t1.id=t2.id;
      -- The command returns the following result.
      +------------+------------+------------+------------+
      | user_id    | user_name  |user_id2    | user_name2 |
      +------------+------------+------------+------------+
      | 9          | hanmeimei  | 9          | hanmeimei  | 
      | 4          | tom        | 4          | tom        | 
      | 7          | haward     | 7          | haward     | 
      | 2          | mary       | 2          | mary       | 
      | 5          | lulu       | 5          | lulu       | 
      | 12         | alice      | 12         | alice      | 
      | 8          | lilei      | 8          | lilei      | 
      | 10         | lily       | 10         | lily       | 
      | 1          | kate       | 1          | kate       | 
      | 11         | lucy       | 11         | lucy       | 
      | 6          | mark       | 6          | mark       | 
      | 3          | bob        | 3          | bob        | 
      +------------+------------+------------+------------+

Hizmet bağlantılı rol

Bu modda Hologres verilerine erişmek için bir hizmet bağlantılı rol oluşturmanız gerekir. Yetkisiz erişimi önlemek amacıyla bu mod kullanıcının kimliğini kimlik doğrulama için Hologres'e iletir; dolayısıyla kullanıcının hem harici tablo hem de altta yatan Hologres tablosu üzerinde izinlere sahip olması gerekir.

Ön Koşullar

  1. MaxCompute istemcisini yükleyip yapılandırdınız.

  2. Hologres harici tablosunu oluşturmak istediğiniz hedef bir MaxCompute projeniz vardır.

    Daha fazla bilgi için bkz. MaxCompute projesi oluşturma.

  3. Hologres'te MaxCompute hesabınızla aynı ada sahip bir hesap bulunur ve bu hesabın hedef tablo üzerinde okuma ve yazma izinleri vardır.

  4. Bu hizmet bağlantılı rol yetkilendirme modu yalnızca Hologres V1.3 ve sonraki sürümlerde desteklenir. Şu anda bu mod yalnızca Hologres harici tablolarından okumayı destekler, yazmayı desteklemez.

MaxCompute'de harici tablo oluşturma

  1. MaxCompute istemcisinde oturum açın ve hedef MaxCompute projenize geçiş yapın.

  2. Hologres harici tablosunu oluşturmak için aşağıdaki ifadeyi çalıştırın.

    Aşağıdaki örnekte Adım 1: Hologres verilerini hazırlama bölümünde hazırlanan veriler kullanılmıştır:

    • Hologres veritabanı adı: holo_external_test.

    • Hologres veritabanı şeması: public.

    • Hologres tablo adı: holo.

    • Hologres klasik ağ uç noktası: hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80.

    CREATE EXTERNAL TABLE IF NOT EXISTS holo_mc_external_dbl
    (
      user_id int,
      user_name string
    )
    STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
    location 'jdbc:postgresql://hgpostcn-cn-****-cn-<region>-internal.hologres.aliyuncs.com:80
      /<holo database name>?ApplicationName=MaxCompute
      &currentSchema=public&table=<table name>/'
    TBLPROPERTIES (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo',
    -- When the column names of the Hologres source table differ from those of the Hologres external table,
    -- add the odps.federation.jdbc.colmapping parameter for column mapping.
    -- This parameter can be omitted when the column names are identical.
      'odps.federation.jdbc.colmapping'='user_id:id,user_name:name'
    );
  3. Harici tabloyu sorgulayın.

    SELECT * FROM holo_mc_external_dbl;
    -- The command returns the following result.
    +------------+------------+
    | user_id    | user_name  | 
    +------------+------------+
    | 9          | hanmeimei  | 
    | 4          | tom        | 
    | 7          | haward     | 
    | 2          | mary       | 
    | 5          | lulu       | 
    | 12         | alice      | 
    | 8          | lilei      | 
    | 10         | lily       | 
    | 1          | kate       | 
    | 11         | lucy       | 
    | 6          | mark       | 
    | 3          | bob        | 
    +------------+------------+

Hologres harici tablolar için doğrudan okumayı etkinleştirin

Varsayılan olarak MaxCompute, Hologres harici tablolardan verileri bir JDBC bağlantısı üzerinden okur. Performansı artırmak amacıyla doğrudan okuma modunu etkinleştirebilirsiniz; bu mod, MaxCompute'un Hologres depolama katmanına doğrudan erişmesini sağlar. Bu modun sağladığı avantajlar şunlardır:

  • Tablo okuma kararlılığı.

  • Okuma gecikme süresini önemli ölçüde azaltır ve veri sorgularını hızlandırır.

  • Yüklem itelemesi ile uyumludur; sorgu filtreleme koşullarını Hologres tarafına iter, taranan veri miktarını azaltır ve maliyetleri düşürür.

  • Hologres FE'ye yapılan bağlantı sayısını büyük ölçüde azaltarak Hologres örneğindeki performans yükünü en aza indirir; çoğu sorgu yalnızca tek bir bağlantı gerektirir.

Sınırlamalar

Hologres için doğrudan okuma modunu etkinleştirdiğinizde aşağıdaki sınırlamalar geçerlidir. Bu koşullar karşılanmadığında sorgu JDBC moduna geri döner.

  1. Sürüm gereksinimleri

    Hologres örneğinizin V1.3.34 veya üzeri bir sürümde olması gerekir. Doğrudan okuma özelliği önceki sürümlerde desteklenmez.

  2. Tablo türü kısıtlamaları

    • Doğrudan okuma modu, Hologres soğuk depolama tabloları için desteklenmez.

    • Doğrudan okuma modu, Hologres satır yönelimli tabloları için desteklenmez.

  3. Veri türü eşleme sınırlamaları

    Doğrudan okuma modunu kullanırken, Hologres'teki Timestamp With Time Zone türünün MaxCompute'ta TIMESTAMP türüne eşlenmesi küçük zaman tutarsızlıklarına neden olabilir. Farklılıklar şu şekildedir:

    • Zaman değeri tutarsızlığı

      • 1900-12-31 15:54:15 tarihinden önceki zaman damgaları için MaxCompute tarafından döndürülen saat 5 dakika 44 saniye ileridedir.

      • 1900-12-31 15:54:16 ile 1969-12-31 23:59:58 arasındaki zaman damgaları için MaxCompute tarafından döndürülen saat 1 saniye ileridedir.

      • 1969-12-31 23:59:59 tarihinden sonraki zaman damgaları için Hologres ve MaxCompute'taki saatler aynıdır.

    • Saat dilimi ofseti

      • Örneğin, MaxCompute saat dilimi UTC+8 ise ve Hologres'teki Timestamp With Time Zone sütunu 2000-01-01 00:00:00 değerine sahipse, MaxCompute 2000-01-01 08:00:00 değerini döndürür.

      • Örneğin, MaxCompute saat dilimi UTC+8 ise ve Hologres'teki Timestamp With Time Zone sütunu 1969-01-01 00:00:00 değerine sahipse, MaxCompute 1969-01-01 08:00:01 değerini döndürür.

  4. Aynı bölge kısıtlaması

    Ağ bağlantısı kısıtlamaları nedeniyle MaxCompute yalnızca aynı bölgedeki Hologres örneklerine erişebilir. Bölgeler arası erişim aşağıdaki hatayla başarısız olur: FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: Pangu request failed with error code 3.

  5. Hologres örneğiniz birincil/ikincil mimari kullanıyorsa, bağlantı URL'sinde yalnızca birincil örneği belirtebilirsiniz; ikincil örnek belirtilemez.

  6. Foreign Server modu için ek sınırlama: MaxCompute projesi için şema düzeyindeki sözdizimi anahtarını etkinleştirmeniz gerekir.

Doğrudan okuma modunu etkinleştirin

Oturumunuz için doğrudan okuma modunu etkinleştirmek üzere MaxCompute'ta SQL sorgunuzdan önce aşağıdaki komutu ekleyin:

SET odps.table.api.enable.holo.table=true;

Doğrudan okuma modunu proje düzeyinde de etkinleştirebilir veya devre dışı bırakabilirsiniz.

-- You can enable direct read and disable JDBC fallback at the project level.
-- Enable direct read at the project level: 
setproject odps.table.api.enable.holo.table=true; -- Set to true to enable, false to disable.
-- Disable the default fallback to JDBC: 
setproject odps.table.api.allow.fallback.jdbc=false; -- Set to true to allow fallback, false to prevent it.

Doğrudan okuma modunu doğrulayın

Bir sorgunun doğrudan okuma modunu kullandığını doğrulamak için Logview günlüklerini kontrol edin. Logview kullanımına ilişkin daha fazla bilgi için bkz. Logview 2.0 kullanarak iş çalıştırma bilgilerini görüntüleme.

Logview'deki Summary sekmesinde external holo tables alanını bulun. Format aşağıdaki gibidir:

<project_name>.<table_name>:<access mode>[<(fallback reason)>]

Parametreler:

Parametre

Açıklama

project_name

Projenin adı.

table_name

Tablonun adı.

access mode

Harici tablo için erişim modu. Geçerli değerler:

  • Optimized: Doğrudan okuma modunun kullanıldığını gösterir. Aşağıda bir Logview örneği verilmiştir. Optimized: Doğrudan okuma optimizasyon modunun etkin olduğunu gösterir. Logview'in Summary bölümünde external holo tables: <project_name>.<table_name>:Optimized ifadesi görüntülenir; bu, harici Holo tablosunun doğrudan okuma optimizasyon yolunu kullandığını gösterir.

  • Fallback: Sistemin JDBC moduna geri döndüğünü gösterir. Aşağıda Logview'den bir örnek verilmiştir. Summary sekmesinde, external holo tables bölümü aliorc_test.holo_lineitem:Fallback (Column type map error Column name l_orderkey Odps type 3 Holo type 4) gibi bir Fallback mesajı görüntülerse, doğrudan okuma modunun kullanılmadığı anlamına gelir. Bunun yerine sistem, sütun türü eşleme hatası nedeniyle Fallback moduna geri dönmüştür. Geri dönüş nedenine ilişkin ayrıntılar için bkz. Doğrudan Okuma Modunda Görüntülenen Geri Dönüş.

Doğrudan okuma modunu kullanan bir iş bir sınırlamayla karşılaştığında otomatik olarak JDBC moduna geri döner. Yoğun iş yükleri altında bu geri dönüş, Hologres bağlantı havuzundan önemli kaynaklar tüketebilir ve JDBC modundaki veri aktarımı, doğrudan okuma moduna kıyasla çok daha verimsizdir. Sonuç olarak, bu kaynaklar yavaş serbest bırakılabilir ve Hologres örneğinizdeki yük artabilir.

Aşırı durumlarda, sık发生的 geri dönüşler aynı Hologres örneğine bağlı diğer iş açısından kritik hizmetleri etkileyebilir. Bunu önlemek için işlerinize set odps.table.api.allow.fallback.jdbc=false; parametresini ekleyerek otomatik geri dönüş mekanizmasını devre dışı bırakabilirsiniz. Bu işlem, işlerin sessizce geri dönmesi yerine başarısız olmasına neden olarak beklenmeyen performans düşüşlerini engeller.

Hologres harici tablolar için yüklem itelemesi

Hologres harici tablolara erişirken MaxCompute, sorgu filtreleme koşullarını yürütme için Hologres'e iletebilir (yüklem itelemesi). Veriler Hologres tarafında önceden filtrelendiğinden veri aktarımı azalır ve sorgu performansı artar. Aşağıdaki senaryolar desteklenir:

  • Hologres Anlık Görüntüsü Yüklem İtelemesi: Filtre ifadesi bir SQL WHERE yan tümcesine dönüştürülür ve holo_create_table_snapshot() işlevinin filter parametresi aracılığıyla Hologres sunucusuna iletilir.

  • Hologres JDBC Yüklem İtelemesi: WHERE koşulu JDBC SQL ifadesine eklenir ve Hologres verileri SQL katmanında filtreler.

  • ORC satır grubu sütun düzeyinde filtreleme: MaxCompute tarafında dosya düzeyinde filtreleme. Her ORC dosyası için bir SearchArgument oluşturulur ve ORC okuyucuya iletilir; okuyucu, sütun istatistiklerini (min/max/count) kullanarak eşleşmeyen satır gruplarını atlar.

Aşağıdaki senaryolar gelecekte desteklenecektir:

  • Bölüm elemesi: Hologres fiziksel bölümlenmiş tablolar için filtre ifadesi, anlık görüntü oluşturulmadan önce her bölüm değerine göre değerlendirilir. Eşleşmeyen bölümler atlanır ve bunlar için anlık görüntü oluşturulmaz.

  • Segment anahtarı filtreleme: Anlık görüntü Hologres'ten döndürüldükten sonra MaxCompute, her dosyanın meta verilerindeki min/max segment anahtarını ayrıştırır ve aralığı filtre ifadesiyle karşılaştırır. Bir dosyanın segment anahtarı aralığı filtreyle hiç örtüşmüyorsa dosya atlanır.

  • Dağıtım kimliği filtreleme: Yalnızca Liquid Tables için desteklenir. Her dosya birden fazla dağıtım kimliğine sahip satırlar içerebilir. Bir RecordBatch okunduktan sonra satırlar dağıtım kimliği aralığına göre filtrelenir.

Kullanım

Senaryo 1: Hologres Snatshot PPD

Hologres doğrudan okuma senaryolarında filtre ifadeleri, mantıksal bölüm tabloları için SQL WHERE yan tümcelerine dönüştürülür ve holo_create_table_snapshot() işlevinin filter parametresi olarak Hologres sunucusuna gönderilir. Bu sayede Hologres, anlık görüntü oluşturma sırasında sunucu tarafında eşleşmeyen dosyaları filtreleyerek MaxCompute'a döndürülen dosya sayısını azaltır ve veri aktarımını minimize eder.

Senaryo

Hologres doğrudan okuma senaryolarında PPD desteği

Temel parametre

predicate_pushdown_mode parametresinin geçerli değerleri:

  • off: Yüklem itelemesini devre dışı bırakır ve tüm verileri okur. Geliştirme ortamında hata ayıklama ve karşılaştırma için bu ayarı kullanabilirsiniz.

  • on: Yalnızca filtrelenmiş anlık görüntüler oluşturmak için yüklem itelemesini etkinleştirir. Üretim ortamları için önerilir.

  • Debug: Performansı karşılaştırmak için iki anlık görüntü oluşturur. Performans testi ve sorun giderme için kullanılabilir.

Örnek sözdizimi:

set odps.external.holo.read.table.rules="{predicate_pushdown_mode:on}";

Desteklenen türler

INT、BIGINT、STRING、DATE、TIMESTAMP、BINARY

Sınırlamalar

Yüklem itelemesi aşağıdakileri desteklemez:

  • Kullanıcı tanımlı işlevler (UDF'ler) veya yerleşik işlevler.

  • Örtük dönüştürme sırasında CAST ifadeleri.

  • jsonb veri türü.

  • Hologres birincil anahtar tabloları.

Uygulanabilir senaryolar

PPD'yi destekleyen Hologres örnekleri; örnek sürümü aşağıdaki gereksinimlerden birini karşılamalıdır.

  • >=3.1.36

  • >=3.2.18

  • >=4.0.7

Senaryo 2: Hologres JDBC PPD

Hologres doğrudan okuma devre dışı bırakıldığında (odps.table.api.enable.holo.table=false), sorgular JDBC yoluyla yürütülür. Bu durumda PPD, Hologres'e gönderilen JDBC SQL ifadesine WHERE yan tümcesini ekleyerek çalışır ve Hologres filtrelemeyi SQL düzeyinde gerçekleştirir. Bu durum, Hologres doğrudan okuma senaryolarındaki PPD'den farklıdır:

  • Doğrudan okuma PPD: Dosyaları anlık görüntü düzeyinde filtreler

  • JDBC PPD: Satırları SQL sorgu düzeyinde filtreler

Senaryo

Hologres JDBC okuma senaryolarında PPD desteği

Temel parametre

odps.external.hive.scan.ppd.enabled parametresinin değerleri:

  • true: Yüklem itelemesini etkinleştirir.

  • false: Yüklem itelemesini devre dışı bırakır.

Parametre sözdizimi örneği:

set odps.external.hive.scan.ppd.enabled=true;

Desteklenen türler

INT、BIGINT、DOUBLE、FLOAT、STRING、DATE、TIMESTAMP、TIMESTAMP_NTZ

Sınırlamalar

Yüklem itelemesi aşağıdakileri desteklemez:

  • Kullanıcı tanımlı işlevler (UDF'ler) veya yerleşik işlevler.

  • CAST ifadeleri.

  • jsonb veri türü.

  • Hologres birincil anahtar tabloları.

Uygulanabilir senaryolar

  • Hologres doğrudan okuma senaryoları için bir geri dönüş çözümü olarak hizmet verir.

  • Bu Hologres örneğinde PPD şu anda desteklenmemektedir.

Senaryo 3: ORC satır grubu sütun düzeyinde filtreleme

MaxCompute tarafında dosya düzeyinde filtreleme. Her ORC dosyası için bir SearchArgument oluşturulur ve ORC okuyucuya iletilir. ORC okuyucu, her stripe/satır grubunun tamamının atlanıp atlanmayacağını belirlemek için sütun istatistiklerini (min/max/count) kullanır.

  • Dosya düzeyinde eleme MaxCompute tarafında gerçekleştirilir

  • Hologres tarafında PPD parametresinin etkin olup olmadığına bağlıdır.

  • Bölümlenmemiş tablolar, fiziksel bölümlenmiş tablolar ve mantıksal bölümlenmiş tabloların tümü desteklenir.

Senaryo

ORC satır grubu sütun düzeyinde filtreleme

Temel parametre

odps.external.holo.use.predicate.pushdown

  • true:Filtrelemeyi etkinleştirir.

  • false:Filtrelemeyi devre dışı bırakır. Bu varsayılan değerdir.

Desteklenen türler

BOOLEAN、INT、BIGINT、FLOAT、DOUBLE、DECIMAL、STRING、DATE、TIMESTAMP

Örnekler

Hologres Snapshot PPD

  1. Verileri hazırlayın. Hologres örneğinizde bir test tablosu oluşturun ve veri ekleyin.

    CREATE TABLE test_multi_type_ppd (
      c_id INT NOT NULL,
      c_boolean BOOLEAN,
      c_int INT,
      c_bigint BIGINT,
      c_double DOUBLE precision,
      c_float REAL,
      c_string TEXT,
      c_date DATE,
      c_timestamp_tz TIMESTAMPTZ,
      c_timestamp_ntz TIMESTAMP
    )
    WITH (SEGMENT_KEY = 'c_id');
    -- Insert 10 rows of data.
    INSERT INTO test_multi_type_ppd VALUES
    (1,  true,   10,  1000,   1.25,  1.5,  'alpha',   '2023-01-01', '2023-01-01 10:00:00+08', '2023-01-01 02:00:00'),
    (2,  false,  20,  2000,  -2.50,  2.5,  'beta',    '2023-01-02', '2023-01-02 10:00:00+08', '2023-01-02 02:00:00'),
    (3,  true,   30,  3000,   3.75, -3.5,  'gamma',   '2023-01-03', '2023-01-03 10:00:00+08', '2023-01-03 02:00:00'),
    (4,  false,  40,  4000,   4.00,  4.5,  'delta',   '2023-01-04', '2023-01-04 10:00:00+08', '2023-01-04 02:00:00'),
    (5,  true,   50,  5000,   5.50,  5.5,  'epsilon', '2023-01-05', '2023-01-05 10:00:00+08', '2023-01-05 02:00:00'),
    (6,  false,  60,  6000,   6.60,  6.0,  'zeta',    '2023-01-06', '2023-01-06 10:00:00+08', '2023-01-06 02:00:00'),
    (7,  true,   70,  7000,   7.70, -7.0,  'eta',     '2023-01-07', '2023-01-07 10:00:00+08', '2023-01-07 02:00:00'),
    (8,  false,  80,  8000,   8.80,  8.0,  'theta',   '2023-01-08', '2023-01-08 10:00:00+08', '2023-01-08 02:00:00'),
    (9,  true,   90,  9000,  -9.90,  9.0,  'iota',    '2023-01-09', '2023-01-09 10:00:00+08', '2023-01-09 02:00:00'),
    (10, false, 100, 10000,  10.10, 10.0,  'kappa',   '2023-01-10', '2023-01-10 10:00:00+08', '2023-01-10 02:00:00');
    SELECT * FROM test_multi_type_ppd;
  2. MaxCompute'ta bir Hologres harici tablosu oluşturun.

    CREATE EXTERNAL TABLE test_multi_type_ppd
    (
      c_id int,
      c_boolean boolean,
      c_int int,
      c_bigint bigint,
      c_double double,
      c_float float,
      c_string string,
      c_date date,
      c_timestamp_tz timestamp,
      c_timestamp_ntz timestamp_ntz
    )
    STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
    WITH serdeproperties ('odps.properties.rolearn'='acs:ram::139****:role/<role name>')
    LOCATION 'jdbc:postgresql://<holo-endpoint>/<db>?currentSchema=public&table=test_multi_type_ppd'
    TBLPROPERTIES (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo'
    );
  3. Harici tabloyu sorgulayın.

    -- Enable Hologres direct read.
    SET odps.table.api.enable.holo.table=true;
    -- Set the PPD mode (off, on, or debug).
    SET odps.external.holo.read.table.rules="{predicate_pushdown_mode:on}";
    -- Configure the type system.
    SET odps.sql.type.system.odps2=true;
    SET odps.sql.decimal.odps2=true;
    -- Allow expressions to be pushed down to TableScan. This is typically enabled by default.
    SET odps.use.builtin.function.input.range=true;
    -- set odps.mcqa.disable=true;
    SELECT * FROM test_multi_type_ppd WHERE c_id = 3;
    -- The query returns the following result.
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    | c_id | c_boolean | c_int | c_bigint   | c_double   | c_float | c_string | c_date | c_timestamp_tz | c_timestamp_ntz |
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    | 3    | true      | 30    | 3000       | 3.75       | -3.5    | gamma    | 2023-01-03 | 2023-01-03 10:00:00 | 2023-01-03 02:00:00 |
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    -- Check the Summary section in Logview. The following information is displayed:
    external holo tables:
    	**.default.test_multi_type_ppd:Optimized
      Holo-side PPD enabled -->   Filter pushdown applied successfully
      Snapshot Id: 56-1-100***
      With-filter file count: 2
      With-filter create snapshot duration: 19ms

Hologres JDBC PPD

  1. Verileri hazırlayın. Hologres örneğinizde bir test tablosu oluşturun ve veri ekleyin.

    CREATE TABLE test_multi_type_ppd (
      c_id INT NOT NULL,
      c_boolean BOOLEAN,
      c_int INT,
      c_bigint BIGINT,
      c_double DOUBLE precision,
      c_float REAL,
      c_string TEXT,
      c_date DATE,
      c_timestamp_tz TIMESTAMPTZ,
      c_timestamp_ntz TIMESTAMP
    )
    WITH (SEGMENT_KEY = 'c_id');
    -- Insert 10 rows of data.
    INSERT INTO test_multi_type_ppd VALUES
    (1,  true,   10,  1000,   1.25,  1.5,  'alpha',   '2023-01-01', '2023-01-01 10:00:00+08', '2023-01-01 02:00:00'),
    (2,  false,  20,  2000,  -2.50,  2.5,  'beta',    '2023-01-02', '2023-01-02 10:00:00+08', '2023-01-02 02:00:00'),
    (3,  true,   30,  3000,   3.75, -3.5,  'gamma',   '2023-01-03', '2023-01-03 10:00:00+08', '2023-01-03 02:00:00'),
    (4,  false,  40,  4000,   4.00,  4.5,  'delta',   '2023-01-04', '2023-01-04 10:00:00+08', '2023-01-04 02:00:00'),
    (5,  true,   50,  5000,   5.50,  5.5,  'epsilon', '2023-01-05', '2023-01-05 10:00:00+08', '2023-01-05 02:00:00'),
    (6,  false,  60,  6000,   6.60,  6.0,  'zeta',    '2023-01-06', '2023-01-06 10:00:00+08', '2023-01-06 02:00:00'),
    (7,  true,   70,  7000,   7.70, -7.0,  'eta',     '2023-01-07', '2023-01-07 10:00:00+08', '2023-01-07 02:00:00'),
    (8,  false,  80,  8000,   8.80,  8.0,  'theta',   '2023-01-08', '2023-01-08 10:00:00+08', '2023-01-08 02:00:00'),
    (9,  true,   90,  9000,  -9.90,  9.0,  'iota',    '2023-01-09', '2023-01-09 10:00:00+08', '2023-01-09 02:00:00'),
    (10, false, 100, 10000,  10.10, 10.0,  'kappa',   '2023-01-10', '2023-01-10 10:00:00+08', '2023-01-10 02:00:00');
    SELECT * FROM test_multi_type_ppd;
  2. MaxCompute'ta bir Hologres harici tablosu oluşturun.

    CREATE EXTERNAL TABLE test_multi_type_ppd
    (
      c_id int,
      c_boolean boolean,
      c_int int,
      c_bigint bigint,
      c_double double,
      c_float float,
      c_string string,
      c_date date,
      c_timestamp_tz timestamp,
      c_timestamp_ntz timestamp_ntz
    )
    STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::122**79014:role/<role name>')
    LOCATION 'jdbc:postgresql://hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute&currentSchema=public&useSSL=true&table=<table name>/'
    TBLPROPERTIES (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo'
    );
  3. Harici tabloyu sorgulayın.

    -- Disable Hologres direct read and use the JDBC path.
    SET odps.table.api.enable.holo.table=false;
    SET odps.table.api.enable.holo.table.auto.fallback=false;
    
    -- Enable JDBC PPD.
    SET odps.external.hive.scan.ppd.enabled=true;
    
    -- Allow expressions to be pushed down to TableScan. 
    -- This is enabled by default in most cases.
    SET odps.use.builtin.function.input.range=true;
    
    -- Enable common table.
    SET odps.sql.common.table.planner.ext.hive.bridge=true;
    SET odps.sql.common.table.planner.ext.hive.bridge.v2=true;
    
    -- After PPD is enabled, TableScan reads only one record.
    SELECT * FROM test_multi_type_ppd WHERE c_id = 3;
    
    -- The query result is as follows:
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    | c_id | c_boolean | c_int | c_bigint   | c_double   | c_float | c_string | c_date | c_timestamp_tz | c_timestamp_ntz |
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    | 3    | true      | 30    | 3000       | 3.75       | -3.5    | gamma    | 2023-01-03 | 2023-01-03 10:00:00 | 2023-01-03 02:00:00 |
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    
    -- Check the stdout details of the instance in Logview. The following messages are displayed:
    [2026-07-22 10:02:41] Volcano instance executor [MainThreadID: 222960]
    Jdbc HoloRecordReader query conditions: (c_id = 3)
    JDBC HoloRecordReader: Query predicate pushdown succeeded.
    JdbcShardRecordReader getSelectQuery: SELECT c_id, c_boolean, c_int, c_bigint, c_double, c_float, c_string, c_date, c_timestamp_tz, c_timestamp_ntz FROM test_multi_type_ppd0721 AS test_multi_type_ppd0721 WHERE ( hg_shard_id = 9) AND ((c_id = 3))

ORC satır grubu sütun düzeyinde filtreleme

Bu yöntem, büyük veri hacmine sahip senaryolar için uygundur. ORC'deki her satır grubu 10.000 satır içerdiğinden, veri hacmi çok küçük olduğunda filtreleme etkisi belirgin değildir.

  1. Verileri hazırlayın. Hologres örneğinde bir test tablosu oluşturun.

    DROP TABLE IF EXISTS test_2m_data;
    
    BEGIN;
    CREATE TABLE test_2m_data (
        id   INT    NOT NULL,
        name TEXT   NOT NULL
    );
    
    -- Set a distribution key to avoid data skew and improve batch write performance.
    CALL set_table_property('test_2m_data', 'distribution_key', 'id');
    COMMIT;
    
    INSERT INTO test_2m_data (id, name)
    SELECT 
        g AS id,
        'user_' || g AS name
    FROM generate_series(1, 2000000) AS g;
    
    SELECT COUNT(*) FROM test_2m_data;
  2. MaxCompute'ta bir Hologres harici tablosu oluşturun.

    CREATE EXTERNAL TABLE ext_holo_test_2m_data
    (
        id          INT  ,
        name        STRING 
    )
    STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::*****:role/<role_name>')
    LOCATION 'jdbc:postgresql://hgpostcn-cn-2bj4lnv16008-cn-<region>-internal.hologres.aliyuncs.com:80/<holo_database>?currentSchema=public&table=test_2m_data'
    TBLPROPERTIES (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo'
    );
  3. Harici tablo verilerini sorgulayın

    -- Enable Hologres direct read
    SET odps.table.api.enable.holo.table=true;
    -- Enable PPD
    SET odps.external.holo.use.predicate.pushdown=true;
    -- Set the PPD mode
    SET odps.external.holo.read.table.rules="{predicate_pushdown_mode:on}";
    SELECT * FROM ext_holo_test_2m_data where id>100 and id<100000;

    LogView'deki örneğin stdout ayrıntılarını kontrol edin. Aşağıdakiler gerçekleşirse filtreleme başarılı olur:

    • TableScan1'de IOCount ve IOLatencyPercentiles görünür.

    • TableScan1'de ReadRowCount, RequestedRowCount değerinden küçüktür.

    37  Filter1                                          99899           0                99998998
        {"PMS":{"S":24584}}
    38  GlobalInit                                       0               769              0
        {"CallBack":{"T":1},"CodeGenDCE":{"T":6393},"CodeGenMajorPass":{"T":13954},"CreateCursor":{"T":41350},
        "CreateOperator":{"T":309351},"JitFunction":{"T":13027},"LoadAndParseIR":{"T":38273},"OpenShuffleRW":{"T":30},
        "parseTableScanInfo":{"T":4551}}
    39  TableScan1                                       163840          1634             100269
        {"PMS":{"S":20480},"actualSplitFileCount":0,"actualSplitFileStats":{"avg":0,"max":0,"min":9223372036854775807},
        "plannedSplitFileCount":0,"plannedSplitFileStats":{"avg":0,"max":0,"min":9223372036854775807}}
        {"DecodingCount":320,"DecodingInBytes":147068,"DecodingLatencyUs":1224,"DecodingOutBytes":1310720,
        "DeltaFileInclusiveLatencyUs":76,"IOBlockingLatencyUs":424255,"IOCount":60,"IOLatencyPercentiles":
        "{\"Count\":\"60\",\"Percentiles\":\"[[0,2835], [0.5,6183], [0.9,6183], [0.95,6183], [0.99,6183], [0.999,6752], [1,
        15206]]\",\"Total\":\"495889\"}","IOReadBytes":27988440,"MaxMemoryUsageBytes":1936240,"ReadRawSize":2346495,
        "ReadRowCount":163840,"ReaderCount":1,"ReaderInclusiveLatencyUs":447950,"RequestedRowCount":2000000,
        "StringDirectReadOutBytes":169113,"Type":"OrcReader","VectorBatchConversionLatencyUs":1636}
    40  TableScan1@CommonTableReader                     0               0                nan
        {"PMS":{"S":19456}}
    41  fuxi                                             0               0                nan
        {"PMS":{"S":0}}
    42  inst                                             0               0                nan
        {"APMS":{"S":0},"PMFM":{"S":1073741824},"PMS":{"S":3246003}}

    Yukarıdaki çıktıda, TableScan1 operatörü IOCount ve IOLatencyPercentiles alanlarını içerir ve ReadRowCount (163840) değeri RequestedRowCount (2000000) değerinden küçüktür; bu da yüklem itelemesi filtrelemenin başarılı olduğunu gösterir.

Hologres veri içe ve dışa aktarma

  • Hologres'ten bir MaxCompute tablosuna veya bölümüne veri aktarmak için LOAD kullanın.

  • Bir MaxCompute projesinden diğer hesaplama motorları tarafından kullanılmak üzere Hologres'e veri aktarmak için UNLOAD kullanın.

Desteklenen veri türleri

  • Decimal türü sınırlamaları

    MaxCompute içinde oluşturulan Hologres harici tablolar için DECIMAL veri türü sabit olarak decimal(38,18) şeklindedir ve değiştirilemez. Kaynak tablo daha az ondalık basamağa sahipse, MaxCompute harici tablosunda sütunu STRING türünde tanımlayabilir ve veriyi kullanırken CAST işlevini kullanarak açıkça dönüştürebilirsiniz.

  • Karmaşık tür sınırlamaları

    MaxCompute içinde oluşturulan Hologres harici tablolar; Array, Map veya Struct gibi karmaşık veri türlerini desteklemez.

  • Diğer uyumsuz türler

    Hologres'teki MONEY gibi veri türleri, MaxCompute'de karşılık gelen bir veri türü bulunmadığından desteklenmez.

Aşağıdaki tabloda Hologres ile MaxCompute arasındaki veri türü eşlemeleri listelenmiştir.

Hologres türü

MaxCompute türü

JDBC okuma

JDBC yazma

Doğrudan okuma (odps.table.api.enable.holo.table=true)

Açıklama

INTEGER (takma ad: INT veya INT4)

INT

Supported

Supported

Supported

32 bit işaretli tamsayı.

TEXT

STRING, VARCHAR

Supported

Supported

Supported

Uzunluk sınırı 8 MB olan dize türü.

SMALLINT

SMALLINT

Supported

Supported

Supported

16 bit işaretli tamsayı.

INT2

SMALLINT

Supported

Supported

Supported

16 bit işaretli tamsayı.

BIGINT (takma ad: INT8)

BIGINT

Supported

Supported

Supported

64 bit işaretli tamsayı.

BYTEA

BINARY

Supported

Supported

Supported

İkili veri türünün geçerli uzunluk sınırı 8 MB'dir. Hologres BINARY veri türünün maksimum boyutu 1 GB'dir.

REAL (takma ad: FLOAT4)

FLOAT

Supported

Supported

Supported

32 bit ikili kayan noktalı sayı.

DOUBLE PRECISION (takma ad: FLOAT8)

DOUBLE

Supported

Supported

Supported

64 bit ikili kayan noktalı sayı.

BOOLEAN (takma ad: BOOL)

BOOLEAN

Supported

Supported

Supported

BOOLEAN türü.

TIMESTAMP

TIMESTAMP_NTZ

Supported

Not supported

Supported

Hologres TIMESTAMP türü mikrosaniye hassasiyetine sahiptir ve saat dilimi içermez.

Nanosaniye hassasiyetine sahip MaxCompute TIMESTAMP_NTZ türüne eşlenir. Hassasiyet farkı tutarsızlıklara neden olabilir.

TIMESTAMP WITH TIME ZONE (takma ad: TIMESTAMPTZ)

TIMESTAMP

Supported

Not supported

Supported

Zaman damgası veri türü nanosaniye hassasiyetindedir ve yyyy-mm-dd hh:mm:ss.xxxxxxxxx biçimini kullanır.

Alt düzey hassasiyet dönüşümü otomatik olarak gerçekleştirilir.

DECIMAL (takma ad: NUMERIC)

DECIMAL(precision,scale)

Supported

Supported

Supported

10 tabanlı kesin sayısal tür.

  • precision: Maksimum basamak sayısını belirtir. Değer aralığı: 1 <= precision <= 38.

  • scale: Ondalık basamak sayısını belirtir. Değer aralığı: 0 <= scale <= 18.

MaxCompute'te, hassasiyet belirtilmediğinde DECIMAL veri türü varsayılan olarak (38,18) değerini alır. IMPORT FOREIGN SCHEMA deyimiyle tablo oluşturduğunuzda sistem hassasiyeti otomatik olarak dönüştürür.

CHAR(n)

CHAR(n)

Supported

Supported

Supported

MaxCompute'te CHAR(n) sabit uzunluklu karakter türüdür. n uzunluğu belirtir. Maksimum uzunluk 255'tir. Daha kısa dizeler boşlukla doldurulur.

Hologres'te CHAR(n) veri türünün maksimum boyutu 1 GB'dir.

VARCHAR(n)

VARCHAR(n)

Supported

Supported

Supported

MaxCompute'teki VARCHAR(n) veri türü değişken uzunluklu karakter türüdür. n parametresi 1 ile 65535 arasında değişen uzunluğu belirtir.

Hologres'te VARCHAR(n) için maksimum boyut 1 GB'dir.

DATE

DATE

Supported

Supported

Supported

Veri türü, yyyy-mm-dd biçimindeki tarihtir.

INT4[]

ARRAY<INT>

Supported

Not supported

Supported

Hologres dizileri, karşılık gelen MaxCompute ARRAY türlerine eşlenir. JDBC aracılığıyla Hologres'e dizi yazmanın desteklenmediğini unutmayın.

INT8[]

ARRAY<BIGINT>

Supported

Not supported

Supported

FLOAT4[]

ARRAY<FLOAT>

Supported

Not supported

Supported

FLOAT8[]

ARRAY<DOUBLE>

Supported

Not supported

Supported

BOOLEAN[]

ARRAY<BOOLEAN>

Supported

Not supported

Supported

TEXT[]

ARRAY<STRING>

Supported

Not supported

Supported

JSONB

JSON

Not supported

Not supported

Supported

Hologres JSONB, MaxCompute'ün JSON türüne eşlenir. Bu eşleme yalnızca doğrudan okuma modunda desteklenir.

JSON

STRING

Supported

Not supported

Not supported

JDBC kullanılırken Hologres JSON türü, boyutu 8 MB ile sınırlayan MaxCompute'ün STRING türüne eşlenir.

SERIAL (otomatik artan)

INT

Supported

Not supported

Supported

MaxCompute, Hologres SERIAL alanlarını INT değeri olarak okur. Yazma işlemlerinde otomatik artırma davranışı desteklenmez.

RoaringBitmap

Desteklenmiyor

Not supported

Not supported

Not supported

MaxCompute'te karşılık gelen bir tür bulunmamaktadır.

RoaringBitmap64

Desteklenmiyor

Not supported

Not supported

Not supported

MaxCompute'te karşılık gelen bir tür bulunmamaktadır.

BIT(n)

Desteklenmiyor

Not supported

Not supported

Not supported

MaxCompute'te karşılık gelen bir tür bulunmamaktadır.

VARBIT(n)

Desteklenmiyor

Not supported

Not supported

Not supported

MaxCompute'te karşılık gelen bir tür bulunmamaktadır.

INTERVAL

Desteklenmiyor

Not supported

Not supported

Not supported

MaxCompute'te karşılık gelen bir tür bulunmamaktadır.

TIMETZ

Desteklenmiyor

Not supported

Not supported

Not supported

MaxCompute'te karşılık gelen bir tür bulunmamaktadır.

TIME

Desteklenmiyor

Not supported

Not supported

Not supported

MaxCompute'te karşılık gelen bir tür bulunmamaktadır.

INET

Desteklenmiyor

Not supported

Not supported

Not supported

MaxCompute'te karşılık gelen bir tür bulunmamaktadır.

MONEY

Desteklenmiyor

Not supported

Not supported

Not supported

MaxCompute'te karşılık gelen bir tür bulunmamaktadır.

OID

Desteklenmiyor

Not supported

Not supported

Not supported

MaxCompute'te karşılık gelen bir tür bulunmamaktadır.

UUID

Desteklenmiyor

Not supported

Not supported

Not supported

MaxCompute'te karşılık gelen bir tür bulunmamaktadır.

SSS

Hologres verilerini doğrudan okurken ODPS-0130071 hatası

  • Sorun

    Hologres'ten doğrudan okuma modunda veri okuduğunuzda, iş ODPS-0130071 Failed to split to equal size...max count: 7777 benzeri bir hata ile başarısız olur. Örneğin:

    ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777
  • Neden

    MaxCompute, Hologres'ten veri okurken varsayılan veri bölme stratejisi, mapper örnek sayısının 7.777 eşzamanlılık sınırını aşmasına neden olabilir.

    Not

    Bu sınır, aşırı sayıda mapper içeren işlerin çalışmasını engelleyerek Hologres dosyalarının ve ağ bağlantılarının kararlılığını korur.

  • Çözüm

    Aşağıdaki parametreleri ayarlayarak bu hatayı çözebilirsiniz.

    SET odps.external.holo.mapper.instances=10000; -- Increase the concurrency limit. The maximum value is 10,000.
    SET odps.sql.mapper.split.size=512; -- Adjust the job concurrency. The maximum value is 512 MB.

Hologres harici tablolarında yavaş SQL işleri

  • Sorun

    SDK kullanarak MaxCompute harici tablosunda veri ararken performans düşüktür.

  • Çözüm

    Harici tablolar yalnızca tam tablo taramalarını desteklediği için yavaş çalışır. Daha iyi performans için bunun yerine bir MaxCompute dahili tablosu kullanın.

Sütun adı bir anahtar sözcük olduğunda oluşan hata

  • Sorun

    Hologres tablonuzdaki bir sütun adı bir anahtar sözcük ise, özel yapılandırma olmadan sorgular aşağıdaki hatalarla başarısız olabilir:

    ODPS-0123131:User defined function exception - SQLException in nextKeyValue

    Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near ","

  • Çözüm

    Hologres kaynak tablosunun sütunlarını Hologres harici tablosunun sütunlarıyla eşlemek için odps.federation.jdbc.colmapping parametresini ekleyin.

    Örneğin, Hologres kaynak tablosu sütun adı olarak "offset" anahtar sözcüğünü içeriyorsa, Hologres harici tablosunu oluştururken 'odps.federation.jdbc.colmapping'='offset:"offset"' parametresini ekleyin.

Hizmete bağlı rol modunda password authentication failed for user "mcslr$STS.**" hatası

  • Sorun

    Bir RAM kullanıcı veya RAM rolü, hizmete bağlı rol yetkilendirme modunu kullanarak bir Hologres harici tablosunu okuduğunda, iş password authentication failed for user "mcslr$STS.******" hatasıyla başarısız olabilir. Aşağıda bir hata mesajı örneği verilmiştir:

    Caused by: java.lang.RuntimeException: java.lang.RuntimeException: org.postgresql.util.PSQLException: 
      ERROR: pooler: c0a981a2413b5: password authentication failed for user "*******$V2#****#TMP.3KvMuCpXhuMbeZsbpaE****m738WfEw73rze
      ohJUeXxhsKza1khCxdKSJQAU5CFac*****qDCA#STS.NZFkZ3TbJNmAjS2TKLdUHHdiW#**.*.*.***"
    	at org.apache.hadoop.mapreduce.lib.db.DBInputFormat.setConf(DBInputFormat.java:171)
    	at com.aliyun.odps.jdbc.wrapper.InputFormatWrapper.checkAndInitDbInputFormat(InputFormatWrapper.java:48)
    	... 45 more
    Caused by: java.lang.RuntimeException: org.postgresql.util.PSQLException: ERROR: pooler: c0a981a2413b5: 
      password authentication failed for user "*******$V2#****#TMP.3KvMuCpXhuMbeZsbpaE****m738WfEw73rzeohJUeXxhsKza1khCxdKSJQAU
      5CFac*****qDCA#STS.NZFkZ3TbJNmAjS2TKLdUHHdiW#**.*.*.***"
    	at org.apache.hadoop.mapreduce.lib.db.DBInputFormat.createConnection(DBInputFormat.java:205)
    	at com.aliyun.odps.jdbc.impl.JdbcDBInputFormat.superCreateConnection(JdbcDBInputFormat.java:69)
    	at com.aliyun.odps.jdbc.impl.JdbcDBInputFormat.createConnection(JdbcDBInputFormat.java:56)
    	at org.apache.hadoop.mapreduce.lib.db.DBInputFormat.setConf(DBInputFormat.java:164)
  • Neden

    Hizmete bağlı rol yetkilendirme modu başarısız oldu.

  • Çözüm

    SQL ifadesinden önce set odps.external.holo.enable.slr = force; parametresini ekleyerek hizmete bağlı rol yetkilendirme modunu zorla etkinleştirin.

Doğrudan okuma modunda Holo-side PPD disabled --> The Holo snapshot PPD mode is enabled, but FAILED to push down the filter into Holo hatası

  • Hata mesajı

    Holo-side PPD disabled --> The Holo snapshot PPD mode is enabled, 
    but FAILED to push down the filter into Holo, 
    errorMsg[storage/table/src/holo/snapshot.cpp(319): 
    StorageException: Create/Get snapshot failed for table: test_multi_type_ppd partition:  
    Query:select holo_create_table_snapshot('public.test_multi_type_ppd', 259200, filter=>$$c_id = 3$$) with error ERROR:  
    internal error: Failed to build fragment dag desc: node type 65 is not supported
  • Çözüm

    Hologres dahili tablonuzun Kullanım notları bölümündeki gereksinimleri karşıladığından emin olun.

Doğrudan Okuma Modunda Geri Dönüş Gösterimi

Logview'in Summary sekmesinde, external holo tables bölümünde Fallback bilgisi görünüyorsa, bu durum doğrudan okuma modunun kullanılmadığını ve sistemin JDBC moduna geri döndüğünü gösterir. Yaygın hatalar ve nedenler aşağıda listelenmiştir:

Hata ayrıntıları

Kök neden

Çözüm

Sütun adı <col> Odps türü <X> Holo türü <Y>, özellikle şu şekilde belirtilir:

  • Sütun adı created_at Odps türü DATETIME Holo türü TIMESTAMP

  • Sütun adı create_date Odps türü STRING Holo türü TIMESTAMP

  • Sütun adı create_time Odps türü STRING Holo türü TIMESTAMP_NTZ

  • Sütun adı manual_enabled Odps türü INT Holo türü BIGINT

  • Sütun adı cpa_bid Odps türü DECIMAL(38,18) Holo türü DECIMAL(38,10)

  • Sütun adı details Odps türü STRING Holo türü JSON

  • Sütun adı history_score_median Odps türü STRING Holo türü DOUBLE

  • Sütun adı l_orderkey Odps türü 3 Holo türü 4

Sütun türü eşleme hatası

Hologres harici tablo alanlarının sütun türleri kaynak tablonunkilerle eşleşmiyor. Doğrudan okuma modunu etkinleştirmek için harici tablonun veri türünü veri türü eşlemesine göre değiştirin.

Odps tablo şeması geçersiz

Genelleme hatası: Ayrıntılar için Logview'deki Hata Günlüklerine bakın.

  • Olası neden 1: Sütun Eşleme yapılandırma hatası—geçersiz metin formatı, birden çok sütunun aynı Hologres sütununa eşlenmesi, mevcut olmayan bir sütunu işaret etmesi veya sütun adı Hologres'te bulunmadığında Eşlemenin yapılandırılmaması.

  • Olası neden 2: Eksik sütunlar—Hologres harici tablo ve kaynak tablo DDL'lerinin eşleştiğini doğrulayın.

Holo bağlantı hatası

Hologres Örnek Bağlantı İstisnası

Yanlış izin bilgileri veya anormal Hologres örnek durumu. Geçerli kullanıcının ilgili Hologres veritabanına erişim iznine sahip olduğunu doğrulayın veya Hologres örneğinin şu anda hizmet verebilir durumda olup olmadığını kontrol edin.

Select hg_version hatası/Hologres sürüm kontrolü hatası/Fetch hg_version veri hatası

Yanlış Hologres örnek sürümü

Hologres örneğini V1.3.34 veya sonraki bir sürüme yükseltin. Örnek sürümünü yükseltmeyle ilgili ayrıntılar için bkz. Örnek yükseltme。

Referanslar

Hologres yabancı tablolarıyla ilgili yaygın sorunlar hakkında daha fazla bilgi için Lakehouse ve Yabancı Tablo SSS konusuna bakın.