All Products
Search
Document Center

Data Management:Konfigurasikan algoritma perutean

Last Updated:Jun 28, 2025

Topik ini menjelaskan format ekspresi perutean dan cara mengonfigurasi algoritma perutean untuk tabel logis.

Informasi latar belakang

Anda dapat mengonfigurasi algoritma perutean untuk tabel logis guna menanyakan data dari tabel fisik tertentu yang sesuai dengan tabel logis berdasarkan bidang perutean. Dengan pendekatan ini, Anda tidak perlu melakukan perhitungan manual atau beralih di antara tabel fisik, sehingga mengurangi overhead perutean.

Untuk informasi lebih lanjut, lihat Algoritma Perutean.

Skenario

  • Menanyakan data dari table shards.
  • Mengubah data dari table shards.
  • Mengekspor data dari table shards.

Format ekspresi

Data Management (DMS) memungkinkan Anda mendefinisikan algoritma perutean untuk menanyakan table shards menggunakan ekspresi Groovy. Format ekspresi perutean serupa dengan yang digunakan dalam kode aplikasi.

Anda dapat menentukan bidang perutean dalam format berikut: #Bidang Perutean#. Contoh: #shardKey#.

Prosedur

Contoh berikut menunjukkan cara mengonfigurasi algoritma perutean untuk operasi modulo sederhana.

  1. Buat tabel logis dalam database logis. Untuk informasi lebih lanjut, lihat Tabel Logis.

  2. Setelah tabel logis dikonfigurasi, temukan database logis pada halaman Pencarian Global. Kemudian, klik Query di kolom Tindakan untuk masuk ke halaman Konsol SQL.

    Catatan

    Anda juga dapat memilih SQL Console > SQL Console di bilah navigasi atas. Lalu, pilih database logis dari daftar drop-down untuk masuk ke halaman Konsol SQL.

  3. Di pojok kanan atas halaman yang muncul, klik ikon image.png untuk masuk ke halaman daftar tabel.

  4. Temukan tabel logis yang telah dibuat. Lalu, klik Configure Algorithm di kolom Algoritma Perutean.

  5. Di halaman yang muncul, klik Create. Di kotak dialog Buat Algoritma, konfigurasikan parameter Algorithm Type, Modulo Operation, Table Partitioning Field, dan Modulus.

    Dalam contoh ini, Modulo Operation on One Column dipilih sebagai Tipe Algoritma, Simple Modulo Operation dipilih sebagai Operasi Modulo, id dipilih sebagai Bidang Partisi Tabel, dan parameter Modulus disetel ke 4. Ekspresi algoritma perutean adalah #id#%4.

    Catatan
    • Operasi modulo sederhana hanya dapat dilakukan pada bidang numerik.

    • Operasi hashing modular dapat dilakukan pada bidang numerik dan string.

  6. Klik Save.

  7. Setelah algoritma perutean dikonfigurasi, tanyakan data dalam tabel logis dan jalankan pernyataan INSERT. Sistem akan menyisipkan data ke dalam table shard yang sesuai berdasarkan hasil yang dihitung menggunakan algoritma perutean.

    Sebagai contoh, jika Anda menyisipkan baris data dengan nilai kolom ID sebesar 9, hasil peruteannya adalah 1 dan baris data tersebut dimasukkan ke dalam table shard bernama logic_table_01.

Contoh ekspresi perutean

Berikut adalah contoh ekspresi perutean, dengan user_id sebagai bidang dalam tabel logis.

  • Perutean Berdasarkan Pembagian Tabel

    • Operasi Modulo Sederhana

      • Operasi modulo pada bidang numerik: #user_id#%100

      • Operasi modulo sekunder: #user_id#%10000%100

      • Operasi modulo pada kode hash Java dari bidang numerik: Math.abs(#user_id#.hashCode())%100

    • Operasi Modulo pada Bidang String

      • Penghashan string numerik: Math.abs(#user_id#.toString().hashCode())%100

      • Penghashan string: Math.abs(#user_id#.hashCode())%100

      • CobarHash: Math.abs(cobarHash(#column#,start, end)).intdiv(8)

      • CobarOldHash: Math.abs(cobarOldHash(#column#, len)).intdiv(8)

  • Perutean Berdasarkan Pembagian Database

    • Route data ke tabel dengan nama yang sama di database yang berbeda: 'schema_prefix_'+(#user_id#%10)+'.table_name'

    • Route data ke database dan tabel yang ditentukan

      • 'schema_prefix_'+(#user_id#%100)+'.table_name_prefix_'+(#user_id#%1000)

      • Route data ke table shard yang sama di setiap database shard: 'schema_prefix_'+lastSwapZero(String.valueOf((#user_id#%1024).intdiv(128),4)+'.table_name_prefix_'+lastSwapZero(String.valueOf((#user_id#%128)),4)

      • Route data ke database yang namanya ditentukan dengan membagi integer yang dibentuk oleh karakter keenam belas dan ketujuh dari bidang EXTEND_ID dengan 2 dan ke tabel yang namanya ditentukan oleh integer yang dibentuk oleh karakter keenam belas dan ketujuh dari bidang EXTEND_ID: 'schema_prefix_'+substring(#EXTEND_ID#,16,18).toLong().intdiv(2)+'.table_name_prefix_'+substring(#EXTEND_ID#,16,18)

  • Perutean Berdasarkan Tanggal

    Route data ke tabel yang sama pada hari yang sama setiap bulan: dayOfMonth(#time#)

  • Perutean Berdasarkan Karakter Ketiga Terakhir dari Bidang String

    Integer.valueOf(substring(#ip_id#,-3,-2))*10: Jika nilai indeks nama tabel bertambah sebesar 10, integer yang dikonversi dari karakter ketiga terakhir dari bidang ip_id dikalikan dengan 10. Jika nilai indeks nama tabel bertambah sebesar 1, integer yang dikonversi dari karakter ketiga terakhir dari bidang ip_id tidak dikalikan dengan 10.

  • Metode Perutean Kompleks Lainnya

    Route data menggunakan fungsi yang didefinisikan pengguna (UDF):

    String func(String arg){ return arg.hashCode()%10;}
    'table_name_'+func(#user_id#)+'_other_'func(#user_id#)
    Catatan
    • Gunakan jeda baris antara fungsi dan ekspresi.

    • DMS mendukung fungsi routing CRC32(java.util.zip.CRC32).

Fungsi bawaan umum

  • cobarOldHash

    Versi sebelumnya dari algoritma corbarHash.

    public static long cobarOldHash(String s, int len) {
      long h = 0;
      int sLen = s.length();
      for (int i = 0; (i < len && i < sLen); i++) {
          h = (h << 5) - h + s.charAt(i);
      }
      return h;
    }
  • cobarHash

    Versi baru dari algoritma cobarHash.

    public static long cobarHash(String s, int start, int end) {
      if (start < 0) {
          start = 0;
      }
      if (end > s.length()) {
          end = s.length();
      }
      long h = 0;
      for (int i = start; i < end; ++i) {
          h = (h << 5) - h + s.charAt(i);
      }
      return h;
    }
  • weekOfYear

    Mengembalikan minggu dalam setahun untuk suatu tanggal.

    public static int weekOfYear(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if(date != null) {
          return DateTimeUtils.getWeekOfYear(date);
      }
    
      return 0;
    }
  • dayOfYear

    Mengembalikan hari dalam setahun untuk suatu tanggal.

    public static int dayOfYear(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if(date != null) {
          return DateTimeUtils.getDayOfYear(date);
      }
    
      return 0;
    }
  • dayOfMonth

    Mengembalikan hari dalam sebulan untuk suatu tanggal.

    public static int dayOfMonth(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if (date != null) {
          return DateTimeUtils.getDayOfMonth(date);
      }
      return 0;
    }
  • dayOfWeek

    Mengembalikan hari dalam seminggu untuk suatu tanggal.

    public static int dayOfWeek(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if (date != null) {
          int dayOfWeek = DateTimeUtils.getDayOfWeek(date);
          if (dayOfWeek==1){
              dayOfWeek=7;
          }else {
              dayOfWeek=dayOfWeek-1;
          }
          return dayOfWeek;
      }
      return 0;
    }
  • substring

    Memotong bidang string dan mengembalikan substring. Nilai parameter awal dan akhir bisa negatif. Dalam hal ini, posisi dihitung mundur.

    public static String substring(String value, int start, int end) {
      return StringUtils.substring(value, start, end);
    }

    Memotong bidang string dan mengembalikan substring. Parameter awal menentukan posisi awal pemotongan.

    public static String substring(String value, int start) {
      return StringUtils.substring(value, start);
    }
  • last4swap

    Mengembalikan substring yang terdiri dari empat karakter terakhir dari bidang string. Jika nilai dari bidang string tidak memiliki panjang empat karakter, sejumlah 0 tertentu akan ditambahkan di sebelah kiri nilai sehingga nilai tersebut berisi empat karakter. Posisi karakter keempat dan ketiga terakhir ditukar dengan dua karakter terakhir untuk membentuk substring.

    public static String last4swap(String value) {
      if(value.length() < 4) {
          value = StringUtils.leftPad(value, 4, '0');
      }
      return StringUtils.substring(value, -2)+StringUtils.substring(value, -4, -2);
    }
  • lastSwapZero

    Mengembalikan substring yang terdiri dari karakter terakhir dari bidang string. Parameter panjang menentukan jumlah karakter yang akan dikembalikan. Jika nilai dari bidang string lebih pendek dari panjang minimum yang ditentukan, sejumlah 0 tertentu akan ditambahkan di sebelah kiri nilai sehingga nilai tersebut berisi karakter dengan panjang minimum yang ditentukan.

    public static String lastSwapZero(String value, int length) {
      if (value.length() < length) {
          return StringUtils.leftPad(value, length, '0');
      }
      return value;
    }