全部产品
Search
文档中心

MaxCompute:PETUNJUK MAPJOIN

更新时间:Nov 05, 2025

Jika Anda ingin menggabungkan tabel besar dengan beberapa tabel kecil, Anda dapat secara eksplisit menentukan petunjuk MAPJOIN dalam pernyataan SELECT untuk meningkatkan kinerja query. Topik ini menjelaskan penggunaan petunjuk MAPJOIN untuk menggabungkan tabel.

Deskripsi

Operasi JOIN terdiri dari tiga tahap: map, shuffle, dan reduce. Dalam banyak kasus, tabel digabungkan pada tahap reduce.

MAPJOIN menggabungkan tabel pada tahap map alih-alih tahap reduce. Hal ini mempercepat transmisi data, mengurangi konsumsi sumber daya sistem, dan mengoptimalkan kinerja pekerjaan.

Pada tahap map, MAPJOIN memuat seluruh data dari tabel kecil yang ditentukan ke dalam memori program yang menjalankan operasi JOIN, sehingga meningkatkan efisiensi operasi JOIN.

Dalam MaxCompute SQL, Anda tidak dapat menggunakan joins non-equi atau logika OR dalam kondisi ON. Namun, hal ini dapat dilakukan dalam MAPJOIN.

Batasan

Berikut adalah batasan penggunaan MAPJOIN:

  • Pada tahap map, MAPJOIN memuat semua data dari tabel yang ditentukan ke dalam memori program yang melakukan operasi JOIN. Tabel yang ditentukan untuk MAPJOIN harus berupa tabel kecil, dan total memori yang digunakan oleh data tabel tidak boleh melebihi 512 MB. MaxCompute mengompresi data sebelum penyimpanan. Setelah tabel kecil dimuat ke dalam memori, volume data tabel meningkat tajam. 512 MB menunjukkan jumlah data maksimum setelah tabel kecil dimuat ke dalam memori.

    Catatan

    512 MB di sini merujuk pada ukuran memori maksimum yang ditempati oleh tabel kecil setelah dimuat ke dalam memori dan didekompresi, bukan ukuran file tabel kecil setelah dikompresi dan disimpan di MaxCompute.

  • Batasan operasi JOIN dalam MAPJOIN:

    • Tabel kiri dalam operasi LEFT OUTER JOIN harus berupa tabel besar.

    • Tabel kanan dalam operasi RIGHT OUTER JOIN harus berupa tabel besar.

    • MAPJOIN tidak dapat digunakan dalam operasi FULL OUTER JOIN.

    • Tabel kiri atau kanan dalam operasi INNER JOIN bisa berupa tabel besar.

  • MaxCompute memungkinkan Anda menentukan maksimal 128 tabel kecil untuk MAPJOIN. Jika Anda menentukan lebih dari 128 tabel kecil, kesalahan sintaks akan dikembalikan.

Catatan Penggunaan

Anda hanya dapat menjalankan MAPJOIN setelah menambahkan petunjuk /*+ mapjoin(<table_name>) */ ke dalam pernyataan SELECT. Perhatikan hal-hal berikut:

  • Saat merujuk ke tabel kecil atau subquery, Anda harus merujuk alias tabel atau subquery tersebut.

  • Dalam MAPJOIN, Anda dapat menggunakan subquery sebagai tabel kecil.

  • Dalam MAPJOIN, Anda dapat menggunakan joins non-equi atau menggabungkan kondisi dengan menggunakan OR. Anda juga dapat menghitung Produk Kartesius dengan menggunakan MAPJOIN ON 1 = 1 tanpa menentukan kondisi ON, seperti select /*+ mapjoin(a) */ a.id from shop a join table_name b on 1=1;. Namun, metode perhitungan ini dapat meningkatkan volume data.

  • Pisahkan beberapa tabel kecil dalam MAPJOIN dengan koma (,), seperti /*+ mapjoin(a,b,c)*/.

Catatan

Beberapa subquery seperti SCALAR, IN, NOT IN, EXISTS, dan NOT EXISTS dapat diubah menjadi operasi JOIN selama eksekusi. MAPJOIN adalah algoritma JOIN yang efisien. Jika hasil SUBQUERY adalah tabel kecil, Anda dapat menggunakan HINT dalam pernyataan subquery untuk secara eksplisit menentukan algoritma MAPJOIN.

Data Contoh

Data contoh sumber disediakan untuk membantu Anda lebih memahami contoh dalam topik ini. Dalam contoh ini, tabel sale_detail dan sale_detail_sj dibuat, dan data dimasukkan ke dalam tabel.

-- Buat tabel partisi bernama sale_detail.
create table if not exists sale_detail
(
shop_name     string,
customer_id   string,
total_price   double
)
partitioned by (sale_date string, region string);

create table if not exists sale_detail_sj
(
shop_name     string,
customer_id   string,
total_price   double
)
partitioned by (sale_date string, region string);

-- Tambahkan partisi ke tabel sale_detail dan sale_detail_sj.
alter table sale_detail add partition (sale_date='2013', region='china');
alter table sale_detail_sj add partition (sale_date='2013', region='china');

-- Masukkan data ke dalam tabel sale_detail dan sale_detail_sj.
insert into sale_detail partition (sale_date='2013', region='china') values ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);
insert into sale_detail_sj partition (sale_date='2013', region='china') values ('s1','c1',100.1),('s2','c2',100.2),('s5','c2',100.2),('s2','c2',100.2);

Contoh

Lakukan operasi JOIN pada tabel sale_detail dan sale_detail_sj. Operasi harus memenuhi salah satu dari kondisi berikut: 1. Total nilai kolom total_price dalam tabel sale_detail_sj kurang dari total nilai kolom total_price dalam tabel sale_detail. 2. Jumlah nilai kolom total_price dalam tabel sale_detail_sj dan nilai kolom total_price dalam tabel sale_detail kurang dari 500. Contoh pernyataan:

-- Izinkan pemindaian penuh pada tabel partisi.
SET odps.sql.allow.fullscan=true;

-- Gunakan MAPJOIN untuk melakukan query.
select /*+ mapjoin(a) */
        a.shop_name,
        a.total_price,
        b.total_price
from sale_detail_sj a join sale_detail b
on a.total_price < b.total_price or a.total_price + b.total_price < 500;

Hasil berikut dikembalikan:

+-----------+-------------+--------------+
| shop_name | total_price | total_price2 |
+-----------+-------------+--------------+
| s1        | 100.1       | 100.1        |
| s2        | 100.2       | 100.1        |
| s5        | 100.2       | 100.1        |
| s2        | 100.2       | 100.1        |
| s1        | 100.1       | 100.2        |
| s2        | 100.2       | 100.2        |
| s5        | 100.2       | 100.2        |
| s2        | 100.2       | 100.2        |
| s1        | 100.1       | 100.3        |
| s2        | 100.2       | 100.3        |
| s5        | 100.2       | 100.3        |
| s2        | 100.2       | 100.3        |
+-----------+-------------+--------------+