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.
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
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.jarJalankan perintah
bin/hiveuntuk 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.
CatatanNama 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.
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 barisEksekusi 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.
CatatanObjek 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
Tentukan HADOOP_CLASSPATH.
HADOOP_CLASSPATH=hadoop-connector.jar bin/hadoop jar row-counter.jarJalankan perintah
find keluaran -type funtuk menanyakan semua file di direktori keluaran.Contoh keluaran:
keluaran/_SUCCESS keluaran/part-r-00000 keluaran/._SUCCESS.crc keluaran/.part-r-00000.crcJalankan perintah
cat keluaran/part-r-00000untuk 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 |