全部产品
Search
文档中心

Tablestore:Tutorial

更新时间:Jul 06, 2025

Topik ini menjelaskan cara menggunakan Hive atau HadoopMR untuk mengakses tabel Tablestore.

Persiapan data

Siapkan tabel bernama pet di Tablestore. Kolom nama adalah satu-satunya kolom kunci utama. Tabel berikut menjelaskan data dalam tabel tersebut.

Catatan

Anda tidak perlu menulis data ke kolom kosong. Tablestore bersifat tanpa skema, sehingga Anda tidak perlu menulis NULL meskipun tidak ada nilai yang tersedia.

nama

pemilik

spesies

jenis kelamin

lahir

kematian

Fluffy

Harold

kucing

f

1993-02-04

Claws

Gwen

kucing

m

1994-03-17

Buffy

Harold

anjing

f

1989-05-13

Fang

Benny

anjing

M

1990-08-27

Bowser

Diane

anjing

m

1979-08-31

1995-07-29

Chirpy

Gwen

burung

f

1998-09-11

Whistler

Gwen

burung

1997-12-09

Slim

Benny

ular

m

1996-04-29

Puffball

Diane

hamster

f

1999-03-30

Mengakses tabel Tablestore menggunakan Hive

  1. Jalankan perintah berikut untuk menambahkan HADOOP_HOME dan HADOOP_CLASSPATH ke /etc/profile:

    export HADOOP_HOME=${Direktori instalasi Hadoop Anda}
    export HADOOP_CLASSPATH=emr-tablestore-1.4.2.jar:tablestore-4.3.1-jar-with-dependencies.jar:joda-time-2.9.4.jar
  2. Jalankan perintah bin/hive untuk masuk ke Hive dan buat tabel eksternal. Contoh pernyataan SQL:

    CREATE EXTERNAL TABLE pet
      (name STRING, owner STRING, species STRING, sex STRING, birth STRING, death STRING)
      STORED BY 'com.aliyun.openservices.tablestore.hive.TableStoreStorageHandler'
      WITH SERDEPROPERTIES(
        "tablestore.columns.mapping"="name,owner,species,sex,birth,death")
      TBLPROPERTIES (
        "tablestore.endpoint"="TitikAkhirAnda",
        "tablestore.access_key_id"="IDAccessKeyAnda",
        "tablestore.access_key_secret"="RahasiaAccessKeyAnda",
        "tablestore.table.name"="pet");

    Tabel berikut menjelaskan parameter yang dapat dikonfigurasi untuk membuat tabel eksternal.

    Parameter

    Deskripsi

    WITH SERDEPROPERTIES

    Konfigurasi pemetaan bidang, termasuk konfigurasi tablestore.columns.mapping.

    Secara default, nama bidang di tabel eksternal sama dengan nama kolom kunci utama atau atribut di tabel Tablestore. Jika nama bidang di tabel eksternal berbeda dari nama kolom di tabel Tablestore, Anda harus menentukan tablestore.columns.mapping. Nilai parameter ini adalah string yang dipisahkan koma. Tidak diperbolehkan spasi di kedua sisi tanda koma (,). Setiap item menentukan nama kolom di tabel Tablestore. Urutan nama kolom sama dengan urutan nama bidang di tabel eksternal.

    Catatan

    Nama kolom di Tablestore dapat berisi karakter spasi. Oleh karena itu, karakter spasi dianggap sebagai bagian dari nama kolom di tabel Tablestore.

    TBLPROPERTIES

    Konfigurasi properti tabel eksternal, yang meliputi:

    • tablestore.endpoint: wajib. Item ini menentukan titik akhir yang digunakan untuk mengakses Tablestore. Anda dapat melihat informasi titik akhir tentang suatu instans di konsol Tablestore. Untuk informasi lebih lanjut tentang titik akhir, lihat Titik Akhir.

    • tablestore.instance: opsional. Item ini menentukan nama instans Tablestore. Jika Anda tidak mengonfigurasi item ini, nama instans adalah bidang pertama dari nilai tablestore.endpoint. Untuk informasi lebih lanjut tentang instans, lihat Instans.

    • tablestore.access_key_id: wajib. Item ini menentukan ID AccessKey akun Alibaba Cloud Anda atau pengguna RAM. Untuk informasi lebih lanjut, lihat Memperoleh Pasangan AccessKey.

      Jika Anda ingin menggunakan kredensial akses sementara yang diperoleh dari Security Token Service (STS) untuk mengakses sumber daya, atur tablestore.access_key_id ke ID AccessKey dalam kredensial akses sementara.

    • tablestore.access_key_secret: wajib. Item ini menentukan Rahasia AccessKey akun Alibaba Cloud Anda atau pengguna RAM. Untuk informasi lebih lanjut, lihat Memperoleh Pasangan AccessKey.

      Jika Anda ingin menggunakan kredensial akses sementara yang diperoleh dari STS untuk mengakses sumber daya, atur tablestore.access_key_secret ke Rahasia AccessKey dalam kredensial akses sementara.

    • tablestore.sts_token: opsional. Item ini menentukan token keamanan dalam kredensial akses sementara. Jika Anda ingin menggunakan kredensial akses sementara yang diperoleh dari STS untuk mengakses sumber daya, Anda harus mengonfigurasi item ini. Untuk informasi lebih lanjut, lihat Gunakan Kebijakan RAM untuk memberikan izin kepada pengguna RAM.

    • tablestore.table.name: wajib. Item ini menentukan nama tabel Tablestore.

  3. Kueri data di tabel eksternal.

    • Eksekusi pernyataan SELECT * FROM pet; untuk menanyakan semua baris dalam tabel.

      Contoh keluaran:

      Bowser  Diane   anjing     j       1979-08-31      1995-07-29
      Buffy   Harold  anjing     b       1989-05-13      NULL
      Chirpy  Gwen    burung    b       1998-09-11      NULL
      Claws   Gwen    kucing     j       1994-03-17      NULL
      Fang    Benny   anjing     j       1990-08-27      NULL
      Fluffy  Harold  kucing     b       1993-02-04      NULL
      Puffball        Diane   hamster b       1999-03-30      NULL
      Slim    Benny   ular   j       1996-04-29      NULL
      Whistler        Gwen    burung    NULL    1997-12-09      NULL
      Waktu yang dibutuhkan: 5.045 detik, Diperoleh 9 baris
    • Eksekusi pernyataan SELECT * FROM pet WHERE birth > "1995-01-01"; untuk menanyakan baris dengan nilai kolom lahir lebih besar dari 1995-01-01.

      Contoh keluaran:

      Chirpy  Gwen    burung    b       1998-09-11      NULL
      Puffball        Diane   hamster b       1999-03-30      NULL
      Slim    Benny   ular   j       1996-04-29      NULL
      Whistler        Gwen    burung    NULL    1997-12-09      NULL
      Waktu yang dibutuhkan: 1.41 detik, Diperoleh 4 baris

Mengakses tabel Tablestore menggunakan HadoopMR

Contoh kode berikut memberikan panduan tentang cara menggunakan HadoopMR untuk mengumpulkan statistik jumlah baris dalam tabel data pet.

  • Buat Mappers dan Reducers

    public class RowCounter {
    public static class RowCounterMapper
    extends Mapper<PrimaryKeyWritable, RowWritable, Text, LongWritable> {
        private final static Text agg = new Text("TOTAL");
        private final static LongWritable one = new LongWritable(1);
    
        @Override
        public void map(
            PrimaryKeyWritable key, RowWritable value, Context context)
            throws IOException, InterruptedException {
            context.write(agg, one);
        }
    }
    
    public static class IntSumReducer
    extends Reducer<Text,LongWritable,Text,LongWritable> {
    
        @Override
        public void reduce(
            Text key, Iterable<LongWritable> values, Context context)
            throws IOException, InterruptedException {
            long sum = 0;
            for (LongWritable val : values) {
                sum += val.get();
            }
            context.write(key, new LongWritable(sum));
        }
    }
    }
                        

    Fungsi map() dari mapper dipanggil setiap kali sumber data membaca satu baris data dari Tablestore. Parameter PrimaryKeyWritable menentukan kunci utama baris tersebut, sedangkan parameter RowWritable menentukan isi dari baris tersebut. Anda dapat memanggil PrimaryKeyWritable.getPrimaryKey() untuk mendapatkan objek kunci utama yang didefinisikan dalam SDK Java untuk Tablestore dan RowWritable.getRow() untuk mendapatkan objek baris yang didefinisikan dalam SDK.

  • Tentukan Tablestore sebagai Sumber Data Mapper

    private static RangeRowQueryCriteria fetchCriteria() {
        RangeRowQueryCriteria res = new RangeRowQueryCriteria("NamaTabelAnda");
        res.setMaxVersions(1);
        List<PrimaryKeyColumn> lower = new ArrayList<PrimaryKeyColumn>();
        List<PrimaryKeyColumn> upper = new ArrayList<PrimaryKeyColumn>();
        lower.add(new PrimaryKeyColumn("NamaKunciUtamaAnda", PrimaryKeyValue.INF_MIN));
        upper.add(new PrimaryKeyColumn("NamaKunciUtamaAnda", PrimaryKeyValue.INF_MAX));
        res.setInclusiveStartPrimaryKey(new PrimaryKey(lower));
        res.setExclusiveEndPrimaryKey(new PrimaryKey(upper));
        return res;
    }
    
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "jumlah baris");
        job.addFileToClassPath(new Path("hadoop-connector.jar"));
        job.setJarByClass(RowCounter.class);
        job.setMapperClass(RowCounterMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        job.setInputFormatClass(TableStoreInputFormat.class);
        TableStoreInputFormat.setEndpoint(job, "https://InstansiAnda.Wilayah.ots.aliyuncs.com/");
        TableStoreInputFormat.setCredential(job, "IDAccessKeyAnda", "RahasiaAccessKeyAnda");
        TableStoreInputFormat.addCriteria(job, fetchCriteria());
        FileOutputFormat.setOutputPath(job, new Path("keluaran"));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }                    

    Dalam contoh sebelumnya, job.setInputFormatClass(TableStoreInputFormat.class) digunakan untuk menentukan Tablestore sebagai sumber data. Anda juga harus melakukan operasi berikut:

    • Sebarkan hadoop-connector.jar ke kluster dan tambahkan jalur hadoop-connector.jar ke classpath. Jalur tersebut adalah lokasi lokal dari hadoop-connector.jar. Jalur ditentukan dalam addFileToClassPath(). Dalam contoh kode, hadoop-connector.jar berada di direktori saat ini.

    • Tentukan titik akhir dan pasangan AccessKey yang digunakan untuk mengakses Tablestore. Gunakan TableStoreInputFormat.setEndpoint() untuk menentukan titik akhir dan TableStoreInputFormat.setCredential() untuk menentukan pasangan AccessKey.

    • Tentukan tabel untuk mencatat statistik jumlah baris dalam tabel Tablestore.

      Catatan
      • Objek RangeRowQueryCriteria yang didefinisikan dalam SDK Java untuk Tablestore ditambahkan ke sumber data setiap kali addCriteria() dipanggil. Anda dapat memanggil addCriteria() beberapa kali. Batasan pada objek RangeRowQueryCriteria sama dengan batasan pada objek RangeRowQueryCriteria yang digunakan oleh operasi GetRange SDK Tablestore untuk Java.

      • Anda dapat menggunakan setFilter() dan addColumnsToGet() dari RangeRowQueryCriteria untuk menyaring baris dan kolom yang tidak diperlukan di server Tablestore. Ini mengurangi volume data yang diakses dan biaya, serta meningkatkan kinerja.

      • Anda dapat menambahkan beberapa objek RangeRowQueryCriteria ke beberapa tabel untuk melakukan kueri gabungan yang menggabungkan hasil dari dua tabel atau lebih yang independen.

      • Anda dapat menambahkan beberapa objek RangeRowQueryCriteria ke satu tabel untuk membagi rentang secara merata. TableStore-Hadoop Connector dapat membagi rentang yang ditentukan oleh pengguna berdasarkan kebijakan tertentu.

Jalankan program

  1. Tentukan HADOOP_CLASSPATH.

    HADOOP_CLASSPATH=hadoop-connector.jar bin/hadoop jar row-counter.jar
  2. Jalankan perintah find keluaran -type f untuk menanyakan semua file di direktori keluaran.

    Contoh keluaran:

    keluaran/_SUCCESS
    keluaran/part-r-00000
    keluaran/._SUCCESS.crc
    keluaran/.part-r-00000.crc
  3. Jalankan perintah cat keluaran/part-r-00000 untuk mengumpulkan statistik jumlah baris di file keluaran/part-r-00000.

    TOTAL   9

Konversi tipe data

Tablestore mendukung tipe data yang sebagian identik dengan tipe data yang didukung oleh Hive atau Spark.

Tabel berikut menjelaskan konversi tipe data yang didukung oleh Tablestore (baris) menjadi tipe data yang didukung oleh Hive atau Spark (kolom).

Tipe data

TINYINT

SMALLINT

INT

BIGINT

FLOAT

DOUBLE

BOOLEAN

STRING

BINARY

INTEGER

Didukung (dengan kehilangan presisi)

Didukung (dengan kehilangan presisi)

Didukung (dengan kehilangan presisi)

Didukung

Didukung (dengan kehilangan presisi)

Didukung (dengan kehilangan presisi)

Tidak didukung

Tidak didukung

Tidak didukung

DOUBLE

Didukung (dengan kehilangan presisi)

Didukung (dengan kehilangan presisi)

Didukung (dengan kehilangan presisi)

Didukung (dengan kehilangan presisi)

Didukung (dengan kehilangan presisi)

Didukung

Tidak didukung

Tidak didukung

Tidak didukung

BOOLEAN

Tidak didukung

Tidak didukung

Tidak didukung

Tidak didukung

Tidak didukung

Tidak didukung

Didukung

Tidak didukung

Tidak didukung

STRING

Tidak didukung

Tidak didukung

Tidak didukung

Tidak didukung

Tidak didukung

Tidak didukung

Tidak didukung

Didukung

Tidak didukung

BINARY

Tidak didukung

Tidak didukung

Tidak didukung

Tidak didukung

Tidak didukung

Tidak didukung

Tidak didukung

Tidak didukung

Didukung