Topik ini menjelaskan cara membuat tabel eksternal Hologres dengan menentukan detail berikut dalam pernyataan CREATE TABLE: sumber data Hologres, metode otorisasi (baik autentikasi STS maupun peran terkait layanan), tabel target, dan informasi driver JDBC.
Ikhtisar
Hologres adalah gudang data analitik interaktif real-time yang kompatibel dengan protokol PostgreSQL dan terintegrasi secara mulus dengan MaxCompute. Anda dapat membuat tabel eksternal Hologres di MaxCompute untuk mengkueri sumber data Hologres menggunakan driver JDBC PostgreSQL dan autentikasi STS. Metode ini menghilangkan penyimpanan berlebihan, tidak memerlukan impor atau ekspor data, serta memberikan hasil kueri yang cepat.
Batasan
Manipulasi data (DML)
MaxCompute tidak mendukung operasi
UPDATEatauDELETEpada tabel eksternal Hologres.Tabel eksternal Hologres tidak mendukung pernyataan
INSERT OVERWRITE.Untuk menimpa data di tabel Hologres dengan data dari MaxCompute, jalankan pernyataan
INSERT OVERWRITEdi Hologres. Pernyataan ini membaca data dari tabel eksternal di Hologres yang dipetakan ke tabel MaxCompute. Untuk informasi selengkapnya, lihat INSERT OVERWRITE.
Risiko penulisan data
Ketika Anda menulis volume data besar ke tabel eksternal Hologres, proses penulisan paralel digunakan. Dalam kasus langka, salah satu proses tersebut mungkin menulis ulang data, menyebabkan duplikasi data.
Partisi
Tabel partisi di Hologres dan MaxCompute tidak saling memetakan secara langsung. Tabel eksternal Hologres tidak mendukung partisi. Namun, dalam mode direct-read, ketika Anda mengkueri tabel eksternal Hologres yang memetakan ke tabel induk partisi Hologres, pemangkasan partisi berlaku jika filter kueri mencakup kondisi pada kolom partisi dari tabel anak partisi yang mendasari.
Tabel eksternal Hologres tidak mendukung atribut
cluster.Tabel eksternal Hologres tidak mendukung pemetaan ke Dynamic Table Hologres.
Lihat daftar Tipe data yang didukung.
Buat tabel eksternal Hologres
Anda dapat membuat tabel eksternal Hologres menggunakan otorisasi peran RAM untuk Hologres (mode STS) atau mode otorisasi peran terkait layanan (mode double-signature).
Pertimbangan
Pedoman pembuatan tabel eksternal
Jika instans Hologres Anda menggunakan daftar putih IP untuk akses eksternal, tingkatkan ke versi yang didukung:
Untuk mode otorisasi peran RAM, tingkatkan ke Hologres V3.2 atau yang lebih baru.
Untuk mode otorisasi peran terkait layanan, tingkatkan ke Hologres V2.0.28 atau yang lebih baru.
Setelah peningkatan, Hologres secara otomatis mempercayai IP node MaxCompute berdasarkan identitas layanan MaxCompute atau peran terkait layanan. Anda tidak perlu lagi menambahkan alamat IP node elastis MaxCompute ke daftar putih IP instans Hologres Anda.
Anda dapat memetakan baik tabel induk maupun tabel anak di Hologres ke tabel eksternal. Namun, Anda hanya dapat membaca dari, bukan menulis ke, tabel eksternal yang memetakan ke tabel induk.
Ketika Anda menulis data ke tabel eksternal Hologres, mekanisme INSERT ON CONFLICT (UPSERT) tidak didukung. Jika tabel sumber Hologres memiliki primary key, hindari menulis data yang menyebabkan konflik primary key.
Nama tabel dan nama kolom tidak peka huruf besar/kecil. Anda tidak dapat menerapkan sensitivitas huruf besar/kecil saat membuat atau mengkueri tabel dan kolom.
Kompatibilitas skema
Jika skema tabel sumber Hologres tidak sesuai dengan skema tabel eksternal, perhatikan poin-poin berikut:
Jumlah kolom tidak sesuai: Jika tabel sumber memiliki lebih sedikit kolom daripada tabel eksternal, pembacaan data gagal dengan kesalahan seperti
column "xxx" does not exist. Jika tabel sumber memiliki lebih banyak kolom daripada tabel eksternal, kolom tambahan diabaikan.Tipe kolom tidak sesuai: MaxCompute tidak dapat memetakan kolom
STRINGdari tabel sumber Hologres ke kolomINTdi tabel eksternal. Memetakan kolomINTke kolomSTRINGdidukung tetapi tidak disarankan.
Sintaks
Ketika membuat tabel eksternal, Anda harus menentukan StorageHandler dalam pernyataan DDL, serta mengonfigurasi string koneksi JDBC dan informasi autentikasi STS (atau mengaktifkan mode otorisasi peran terkait layanan) untuk mengakses sumber data Hologres.
Mode peran RAM
Untuk contoh kode lengkap, lihat Buat tabel eksternal Hologres (mode otorisasi peran RAM).
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'='<ram_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',
'odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...'
);Mode peran terkait layanan
Untuk contoh kode lengkap, lihat Buat tabel eksternal Hologres (mode otorisasi peran terkait layanan).
Mode otorisasi peran terkait layanan memungkinkan pengguna RAM yang sama mengakses tabel yang diotorisasi di MaxCompute dan Hologres tanpa memerlukan otorisasi manual. Mode ini juga mendukung fitur daftar putih IP Hologres untuk menyederhanakan penggunaan.
-- Buat tabel eksternal
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',
['odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...']
);Parameter
Contoh
Langkah 1: Siapkan data Hologres
Anda dapat melewati langkah ini jika sudah memiliki database, tabel, dan data uji Hologres.
Buat database Hologres
Login ke Konsol manajemen Hologres. Di pojok kiri atas, pilih wilayah.
Di panel navigasi kiri, klik Instances.
Jika Anda belum memiliki instans, Anda harus terlebih dahulu membeli instans Hologres.
Di halaman Instances, klik nama instans target.
Di halaman detail instans, klik Connect to Instance.
Klik tab Metadata Management.
Klik Create Database, masukkan Database Name di kotak dialog yang muncul, dan biarkan parameter lain pada pengaturan defaultnya.
Buat tabel Hologres
Di halaman detail instans, klik Connect to Instance.
Klik tab SQL Editor.
Jalankan pernyataan berikut untuk membuat tabel dan memasukkan data:
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;
Langkah 2: Buat tabel eksternal Hologres
Peran RAM
Dalam mode ini, pembuat tabel eksternal menyematkan peran RAM dengan izin akses data Hologres dalam definisi tabel eksternal. Anda kemudian dapat memberikan izin pada tabel eksternal ini kepada pengguna MaxCompute lain sesuai kebutuhan. Saat pengguna mengakses tabel eksternal, sistem menggunakan peran RAM yang terikat untuk mengakses data di tabel Hologres yang dipetakan.
Hologres tidak mendukung penambahan peran RAM lintas akun ke instans database. Oleh karena itu, Hologres dalam mode STS hanya mendukung peran RAM dari akun yang sama. Demikian pula, saat MaxCompute mengakses Hologres menggunakan tabel eksternal atau skema eksternal, hanya peran RAM dari akun yang sama yang didukung.
Prasyarat
Anda telah menginstal dan mengonfigurasi klien MaxCompute.
Anda memiliki proyek MaxCompute target tempat Anda ingin membuat tabel eksternal Hologres.
Untuk informasi selengkapnya, lihat Buat proyek MaxCompute.
Anda telah membuat dan mengotorisasi Peran RAM. Untuk informasi selengkapnya, lihat Mengotorisasi Peran RAM untuk Hologres.
Buat tabel eksternal di MaxCompute
Login ke klien MaxCompute dan beralih ke proyek MaxCompute target Anda.
Jalankan pernyataan berikut untuk membuat tabel eksternal Hologres.
Contoh berikut menggunakan data yang disiapkan di Langkah 1: Siapkan data Hologres:
Nama database Hologres:
holo_external_test.Skema database Hologres:
public.Nama tabel Hologres:
holo.Endpoint jaringan klasik Hologres:
hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80.
CREATE EXTERNAL TABLE IF NOT EXISTS my_table_holo_jdbc ( id bigint, 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-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute¤tSchema=public&useSSL=true&table=<table name>/' tblproperties ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', 'odps.federation.jdbc.colmapping'='id:id,name:name' );Jalankan perintah berikut untuk mengkueri tabel sumber Hologres menggunakan tabel eksternal yang baru dibuat.
-- Properti berikut wajib untuk mengakses tabel eksternal Hologres. SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; SET odps.table.api.enable.holo.table=true; --Aktifkan akses baca langsung JDBC -- Kueri data dari tabel eksternal Hologres. SELECT * FROM my_table_holo_jdbc limit 10; -- Perintah mengembalikan hasil berikut. +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 8 | lilei | | 10 | lily | | 1 | kate | | 6 | mark | | 11 | lucy | +------------+------------+Gunakan tabel eksternal Hologres untuk bertukar data dengan Hologres dan melakukan analisis federasi.
Tulis data yang diproses di MaxCompute ke Hologres menggunakan tabel eksternal untuk analitik dipercepat dan layanan online.
-- Properti berikut wajib untuk mengakses tabel eksternal Hologres. SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; SET odps.table.api.enable.holo.table=true; --Aktifkan akses baca langsung JDBC -- Masukkan data ke tabel eksternal Hologres. INSERT INTO my_table_holo_jdbc VALUES (12,'alice'); -- Kueri data dari tabel eksternal Hologres. SELECT * FROM my_table_holo_jdbc; -- Perintah mengembalikan hasil berikut. +------------+------------+ | id | 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 | +------------+------------+Simpan tabel dimensi yang sering diperbarui di Hologres untuk mendukung pembaruan real-time. MaxCompute mengakses tabel dimensi menggunakan tabel eksternal dan menggabungkannya dengan tabel fakta di MaxCompute untuk analisis federasi.
-- Properti berikut wajib untuk mengakses tabel eksternal Hologres. SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; -- Buat tabel internal MaxCompute. CREATE TABLE holo_test AS SELECT * FROM my_table_holo_jdbc; -- Gabungkan tabel internal MaxCompute dengan tabel eksternal Hologres untuk analisis. SELECT * FROM my_table_holo_jdbc t1 INNER JOIN holo_test t2 ON t1.id=t2.id; -- Perintah mengembalikan hasil berikut. +------------+------------+------------+------------+ | id | name | id2 | 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 | +------------+------------+------------+------------+
Peran terkait layanan
Dalam mode ini, Anda harus membuat peran terkait layanan untuk mengakses data Hologres. Untuk mencegah akses tidak sah, mode ini meneruskan identitas pengguna ke Hologres untuk autentikasi. Oleh karena itu, pengguna harus memiliki izin pada tabel eksternal dan tabel Hologres yang mendasarinya.
Prasyarat
Anda telah menginstal dan mengonfigurasi klien MaxCompute.
Anda memiliki proyek MaxCompute target tempat Anda ingin membuat tabel eksternal Hologres.
Untuk informasi selengkapnya, lihat Buat proyek MaxCompute.
Akun dengan nama yang sama dengan akun MaxCompute Anda ada di Hologres, dan akun ini memiliki izin baca dan tulis pada tabel target.
Mode otorisasi peran terkait layanan ini hanya didukung di Hologres V1.3 dan yang lebih baru. Saat ini, mode ini hanya mendukung pembacaan dari, bukan penulisan ke, tabel eksternal Hologres.
Buat tabel eksternal di MaxCompute
Login ke klien MaxCompute dan beralih ke proyek MaxCompute target Anda.
Jalankan pernyataan berikut untuk membuat tabel eksternal Hologres.
Contoh berikut menggunakan data yang disiapkan di Langkah 1: Siapkan data Hologres:
Nama database Hologres:
holo_external_test.Skema database Hologres:
public.Nama tabel Hologres:
holo.Endpoint jaringan klasik Hologres:
hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80.
-- Buat tabel eksternal. CREATE EXTERNAL TABLE IF NOT EXISTS holo_mc_external_dbl ( id int, name string ) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' location 'jdbc:postgresql://hgpostcn-cn-****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute¤tSchema=public&useSSL=false&table=<table name>/' TBLPROPERTIES ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', 'odps.federation.jdbc.colmapping'='id:id,name:name' );Kueri tabel eksternal.
SELECT * FROM holo_mc_external_dbl; -- Perintah mengembalikan hasil berikut. +------------+------------+ | id | 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 | +------------+------------+
Aktifkan baca langsung untuk tabel eksternal Hologres
Secara default, MaxCompute membaca data dari tabel eksternal Hologres melalui koneksi JDBC. Untuk meningkatkan kinerja, Anda dapat mengaktifkan mode baca langsung yang memungkinkan MaxCompute mengakses langsung lapisan penyimpanan Hologres. Mode ini memberikan manfaat berikut:
Mengurangi latensi baca untuk kinerja kueri yang lebih cepat.
Meminimalkan jumlah koneksi ke frontend Hologres. Sebagian besar kueri hanya memerlukan satu koneksi.
Batasan
Ketika Anda mengaktifkan mode baca langsung untuk Hologres, batasan berikut berlaku. Jika kondisi ini tidak terpenuhi, kueri akan kembali ke mode JDBC.
Persyaratan versi
Instans Hologres Anda harus V1.3.34 atau yang lebih baru. Fitur baca langsung tidak didukung di versi sebelumnya.
Batasan tipe tabel
Mode baca langsung tidak didukung untuk tabel penyimpanan dingin Hologres.
Mode baca langsung tidak didukung untuk tabel berorientasi baris Hologres.
Batasan pemetaan tipe data
Ketika Anda menggunakan mode baca langsung, memetakan tipe Timestamp With Time Zone di Hologres ke tipe TIMESTAMP di MaxCompute dapat menyebabkan perbedaan waktu kecil. Perbedaannya sebagai berikut:
Perbedaan nilai waktu
Untuk timestamp sebelum
1900-12-31 15:54:15, waktu yang dikembalikan oleh MaxCompute lebih cepat 5 menit 44 detik.Untuk timestamp antara
1900-12-31 15:54:16dan1969-12-31 23:59:58, waktu yang dikembalikan oleh MaxCompute lebih cepat 1 detik.Untuk timestamp setelah
1969-12-31 23:59:59, waktu di Hologres dan MaxCompute identik.
Offset zona waktu
Sebagai contoh, jika zona waktu MaxCompute adalah UTC+8 dan kolom Timestamp With Time Zone di Hologres adalah
2000-01-01 00:00:00, MaxCompute mengembalikan2000-01-01 08:00:00.Sebagai contoh, jika zona waktu MaxCompute adalah UTC+8 dan kolom Timestamp With Time Zone di Hologres adalah
1969-01-01 00:00:00, MaxCompute mengembalikan1969-01-01 08:00:01.
Batasan wilayah yang sama
Karena kendala konektivitas jaringan, MaxCompute hanya dapat mengakses instans Hologres di wilayah yang sama. Akses lintas wilayah gagal dengan kesalahan berikut:
FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: Pangu request failed with error code 3.Jika instans Hologres Anda menggunakan arsitektur primary/secondary, Anda hanya dapat menentukan instans utama dalam URL koneksi, bukan instans secondary.
Batasan tambahan untuk mode Foreign Server: Anda harus mengaktifkan sakelar sintaks tingkat skema untuk proyek MaxCompute.
Aktifkan mode baca langsung
Untuk mengaktifkan mode baca langsung untuk sesi Anda, tambahkan perintah berikut sebelum kueri SQL Anda di MaxCompute:
SET odps.table.api.enable.holo.table=true;Anda juga dapat mengaktifkan atau menonaktifkan mode baca langsung di tingkat proyek.
-- Anda dapat mengaktifkan baca langsung dan menonaktifkan fallback JDBC default di tingkat proyek.
-- Aktifkan baca langsung di tingkat proyek:
setproject odps.table.api.enable.holo.table=true; -- Atur ke true untuk mengaktifkan, false untuk menonaktifkan.
-- Nonaktifkan fallback default ke JDBC:
setproject odps.table.api.allow.fallback.jdbc=false; -- Atur ke true untuk mengizinkan fallback, false untuk mencegahnya.Verifikasi mode baca langsung
Untuk memverifikasi bahwa kueri menggunakan mode baca langsung, periksa log di Logview. Untuk informasi selengkapnya tentang cara menggunakan Logview, lihat Gunakan Logview 2.0 untuk melihat informasi eksekusi pekerjaan.
Di tab Summary di Logview, temukan bidang external holo tables. Formatnya sebagai berikut:
<project_name>.<table_name>:<access mode>[<(fallback reason)>]Parameter:
Parameter | Deskripsi |
project_name | Nama proyek. |
table_name | Nama tabel. |
access mode | Mode akses untuk tabel eksternal. Nilai yang valid:
|
fallback reason | Jika access mode adalah
|
Ketika pekerjaan yang menggunakan mode baca langsung menghadapi batasan, pekerjaan tersebut secara otomatis kembali ke mode JDBC. Di bawah beban kerja berat, fallback ini dapat mengonsumsi sumber daya signifikan dari kolam koneksi Hologres, dan transfer data dalam mode JDBC jauh lebih tidak efisien daripada dalam mode baca langsung. Akibatnya, sumber daya ini mungkin dilepaskan secara perlahan, meningkatkan beban pada instans Hologres Anda.
Dalam kasus ekstrem, fallback yang sering dapat memengaruhi layanan penting lain yang bergantung pada instans Hologres yang sama. Untuk mencegah hal ini, Anda dapat menonaktifkan mekanisme fallback otomatis dengan menambahkan parameter set odps.table.api.allow.fallback.jdbc=false; ke pekerjaan Anda. Ini menyebabkan pekerjaan gagal alih-alih diam-diam kembali, yang mencegah degradasi kinerja tak terduga.
Penurunan predikat untuk tabel eksternal Hologres
Ketika Anda mengkueri tabel eksternal Hologres di MaxCompute, Anda dapat menurunkan kondisi filter kueri ke Hologres. Teknik ini, yang dikenal sebagai penurunan predikat (PPD), memfilter data di sumber, yang mengurangi jumlah data yang ditransfer dan meningkatkan kinerja kueri. Penurunan predikat sangat efektif dalam skenario berikut:
Kueri dengan kondisi filter selektif yang memfilter sejumlah besar data.
Kueri pada tabel partisi logis.
Catatan
Skenario | Deskripsi |
Parameter inti | Nilai yang valid untuk parameter
Sintaks contoh:
|
Tipe yang didukung | INT, BIGINT, STRING, DATE, TIMESTAMP, BINARY |
Batasan |
|
Skenario Penerapan |
|
Contoh
Siapkan data. Di instans Hologres Anda, buat tabel uji dan masukkan data.
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'); -- Masukkan 10 baris 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;Buat tabel eksternal Hologres di MaxCompute.
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' 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' );Kueri tabel eksternal.
-- Aktifkan baca langsung Hologres. SET odps.table.api.enable.holo.table=true; -- Atur mode PPD (off, on, atau debug). SET odps.external.holo.read.table.rules="{predicate_pushdown_mode:on}"; -- Konfigurasi sistem tipe. SET odps.sql.type.system.odps2=true; SET odps.sql.decimal.odps2=true; -- Izinkan ekspresi diturunkan ke TableScan. Ini biasanya diaktifkan secara default. SET odps.use.builtin.function.input.range=true; -- set odps.mcqa.disable=true; SELECT * FROM test_multi_type_ppd WHERE c_id = 3; -- Kueri mengembalikan hasil berikut. +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+ | 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 | +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+ -- Periksa bagian Summary di Logview. Informasi berikut ditampilkan: 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
Impor dan ekspor data Hologres
Tipe data yang didukung
Batasan tipe desimal
Untuk tabel eksternal Hologres yang dibuat di MaxCompute, tipe data
DECIMALtetap padadecimal(38,18)dan tidak dapat dimodifikasi. Jika tabel sumber memiliki tempat desimal lebih sedikit, Anda dapat mendefinisikan kolom sebagai tipeSTRINGdi tabel eksternal MaxCompute dan kemudian menggunakan fungsiCASTuntuk secara eksplisit mengonversi data saat menggunakannya.Batasan tipe kompleks
Tabel eksternal Hologres yang dibuat di MaxCompute tidak mendukung tipe data kompleks seperti
Array,Map, atauStruct.Tipe lain yang tidak kompatibel
Tipe data di Hologres, seperti
MONEY, tidak didukung karena tidak ada tipe data yang sesuai di MaxCompute.
Tabel berikut mencantumkan pemetaan tipe data antara Hologres dan MaxCompute.
Tipe Hologres | Tipe MaxCompute | Baca JDBC | Tulis JDBC | Baca langsung (odps.table.api.enable.holo.table=true) | Deskripsi |
INTEGER (alias: INT atau INT4) | INT | Bilangan bulat bertanda 32-bit. | |||
TEXT | STRING, VARCHAR | Tipe string dengan batas panjang 8 MB. | |||
SMALLINT | SMALLINT | Bilangan bulat bertanda 16-bit. | |||
INT2 | SMALLINT | Bilangan bulat bertanda 16-bit. | |||
BIGINT (alias: INT8) | BIGINT | Bilangan bulat bertanda 64-bit. | |||
BYTEA | BINARY | Tipe data biner saat ini memiliki batas panjang 8 MB. Tipe data | |||
REAL (alias: FLOAT4) | FLOAT | Bilangan titik mengambang biner 32-bit. | |||
DOUBLE PRECISION (alias: FLOAT8) | DOUBLE | Bilangan titik mengambang biner 64-bit. | |||
BOOLEAN (alias: BOOL) | BOOLEAN | Tipe BOOLEAN. | |||
TIMESTAMP | TIMESTAMP_NTZ | Tipe Tipe ini dipetakan ke | |||
TIMESTAMP WITH TIME ZONE (alias: TIMESTAMPTZ) | TIMESTAMP | Tipe data timestamp akurat hingga nanodetik dan menggunakan format Konversi presisi dasar ditangani secara otomatis. | |||
DECIMAL (alias: NUMERIC) | DECIMAL(precision,scale) | Tipe numerik eksak basis-10.
Di MaxCompute, tipe data | |||
CHAR(n) | CHAR(n) | Di MaxCompute, Ukuran maksimum tipe data | |||
VARCHAR(n) | VARCHAR(n) | Tipe data Di Hologres, ukuran maksimum untuk | |||
DATE | DATE | Tipe data tanggal dalam format | |||
INT4[] | ARRAY<INT> | Array Hologres dipetakan ke tipe | |||
INT8[] | ARRAY<BIGINT> | ||||
FLOAT4[] | ARRAY<FLOAT> | ||||
FLOAT8[] | ARRAY<DOUBLE> | ||||
BOOLEAN[] | ARRAY<BOOLEAN> | ||||
TEXT[] | ARRAY<STRING> | ||||
JSONB | JSON |
| |||
JSON | STRING | Saat menggunakan JDBC, tipe | |||
SERIAL (auto-increment) | INT | MaxCompute membaca field | |||
RoaringBitmap | Tidak didukung | Tidak ada tipe yang sesuai di MaxCompute. | |||
RoaringBitmap64 | Tidak didukung | Tidak ada tipe yang sesuai di MaxCompute. | |||
BIT(n) | Tidak didukung | Tidak ada tipe yang sesuai di MaxCompute. | |||
VARBIT(n) | Tidak didukung | Tidak ada tipe yang sesuai di MaxCompute. | |||
INTERVAL | Tidak didukung | Tidak ada tipe yang sesuai di MaxCompute. | |||
TIMETZ | Tidak didukung | Tidak ada tipe yang sesuai di MaxCompute. | |||
TIME | Tidak didukung | Tidak ada tipe yang sesuai di MaxCompute. | |||
INET | Tidak didukung | Tidak ada tipe yang sesuai di MaxCompute. | |||
MONEY | Tidak didukung | Tidak ada tipe yang sesuai di MaxCompute. | |||
OID | Tidak didukung | Tidak ada tipe yang sesuai di MaxCompute. | |||
UUID | Tidak didukung | Tidak ada tipe yang sesuai di MaxCompute. |
FAQ
Kesalahan ODPS-0130071 saat membaca langsung data Hologres
Masalah
Saat membaca data dari Hologres dalam mode baca langsung, pekerjaan gagal dengan kesalahan serupa
ODPS-0130071 Failed to split to equal size...max count: 7777. Contohnya: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: 7777Penyebab
Saat MaxCompute membaca data dari Hologres, strategi pemisahan data defaultnya dapat menyebabkan jumlah instans mapper melebihi batas konkurensi 7.777.
CatatanBatas ini mencegah pekerjaan dengan jumlah mapper berlebihan berjalan, yang melindungi stabilitas file dan koneksi jaringan Hologres.
Solusi
Anda dapat mengatasi kesalahan ini dengan mengatur parameter berikut.
SET odps.external.holo.mapper.instances=10000; -- Tingkatkan batas konkurensi. Nilai maksimum adalah 10.000. SET odps.sql.mapper.split.size=512; -- Sesuaikan konkurensi pekerjaan. Nilai maksimum adalah 512 MB.
Pekerjaan SQL lambat pada tabel eksternal Hologres
Masalah
Kinerja lambat saat Anda menggunakan SDK untuk mencari data di tabel eksternal MaxCompute.
Solusi
Tabel eksternal berkinerja lambat karena hanya mendukung pemindaian tabel penuh. Untuk kinerja yang lebih baik, gunakan tabel internal MaxCompute sebagai gantinya.
Kesalahan saat nama kolom adalah kata kunci
Masalah
Jika nama kolom di tabel Hologres Anda adalah kata kunci, kueri mungkin gagal dengan kesalahan berikut tanpa konfigurasi khusus:
ODPS-0123131:User defined function exception - SQLException in nextKeyValueCaused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near ","Solusi
Tambahkan parameter
odps.federation.jdbc.colmappinguntuk memetakan kolom tabel sumber Hologres ke kolom tabel eksternal Hologres.Sebagai contoh, jika tabel sumber Hologres berisi kata kunci
"offset"sebagai nama kolom, tambahkan parameter'odps.federation.jdbc.colmapping'='offset:"offset"'saat membuat tabel eksternal Hologres.
Kesalahan password authentication failed for user "mcslr$STS.******" dalam mode double-signature
Masalah
Saat pengguna RAM atau peran RAM membaca tabel eksternal Hologres menggunakan mode otorisasi peran terkait layanan (mode double-signature), pekerjaan mungkin gagal dengan kesalahan
password authentication failed for user "mcslr$STS.******". Berikut contoh pesan kesalahan:ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: splitByCommonTable() failed, dataSourceId=[TableScan1], tableId=[*****.*****], location=[jdbc:postgresql://hgpostcn-cn-*****-cn-beijing-internal.hologres.aliyuncs.com:80/*****?ApplicationName=MaxCompute¤tSchema=public&useSSL=false&table=*****/], rootCause -> common/table/jni/utils/jni_helper.cpp(126): UnretryableException: Common table io jni exception - ExceptionType: com.aliyun.odps.hive.wrapper.thrift.RequestException Message: null StackTrace: RequestException(reason:java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: org.postgresql.util.PSQLException: FATAL: password authentication failed for user "mcslr$STS.*********"Solusi
Kesalahan ini menunjukkan bahwa pengguna tidak memiliki izin baca yang diperlukan untuk tabel di Hologres. Untuk mengatasi ini, login ke konsol Hologres dengan Akun Alibaba Cloud Anda atau akun administrator. Di konsol, buka Pusat Keamanan, tambahkan pengguna ke Manajemen Pengguna, dan berikan izin database yang diperlukan.
Kesalahan Holo-side PPD disabled --> The Holo snapshot PPD mode is enabled, but FAILED to push down the filter into Holo dalam mode baca langsung
Pesan kesalahan
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 supportedSolusi
Pastikan tabel internal Hologres Anda memenuhi persyaratan di Catatan penggunaan.
Referensi
Untuk informasi selengkapnya tentang masalah umum dengan tabel asing Hologres, lihat FAQ Lakehouse dan Tabel Asing.