Contoh perintah Hive untuk mengekspor, mengimpor, dan membuat kueri data di DynamoDB - Amazon EMR

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Contoh perintah Hive untuk mengekspor, mengimpor, dan membuat kueri data di DynamoDB

Contoh berikut menggunakan perintah Hive untuk melaksanakan operasi seperti mengekspor data ke Amazon S3 atau HDFS, mengimpor data ke DynamoDB, menggabungkan tabel, melakukan kueri tabel, dan banyak lagi.

Operasi pada data referensi tabel Hive yang disimpan dalam DynamoDB. Perintah Hive tunduk pada pengaturan throughput ditetapkan tabel DynamoDB, dan data yang diambil termasuk data yang ditulis ke tabel DynamoDB pada saat permintaan operasi Hive diproses oleh DynamoDB. Jika proses pengambilan data memakan waktu lama, beberapa data yang dikembalikan oleh perintah Hive mungkin telah diperbarui di DynamoDB sejak perintah Hive dimulai.

Perintah Hive DROP TABLE dan CREATE TABLE hanya bertindak pada tabel lokal di Hive dan tidak membuat atau menghapus tabel di DynamoDB. Jika kueri Hive Anda membuat referensi tabel di DynamoDB, maka tabel tersebut harus sudah ada sebelum Anda menjalankan kueri. Untuk informasi selengkapnya tentang membuat dan menghapus tabel di DynamoDB, lihat Bekerja dengan tabel di DynamoDB dalam Panduan Developer Amazon DynamoDB.

catatan

Ketika Anda memetakan tabel Hive ke lokasi di Amazon S3, jangan memetakan ke jalur akar bucket, s3://mybucket, karena hal ini dapat menyebabkan kesalahan ketika Hive menulis data ke Amazon S3. Sebaliknya, petakan tabel ke subpath bucket, yaitu s3://mybucket/mypath.

Mengekspor data dari DynamoDB

Anda dapat menggunakan Hive untuk mengekspor data dari DynamoDB.

Untuk mengekspor tabel DynamoDB ke bucket Amazon S3
  • Buat tabel Hive yang melakukan referensi data yang disimpan dalam DynamoDB. Kemudian Anda dapat memanggil perintah INSERT OVERWRITE untuk menulis data ke direktori eksternal. Pada contoh berikut, s3://bucketname/path/subpath/ adalah path yang valid di Amazon S3. Sesuaikan kolom dan tipe data dalam perintah CREATE untuk mencocokkan nilai-nilai dalam DynamoDB Anda. Anda dapat menggunakan ini untuk membuat arsip data DynamoDB Anda di Amazon S3.

    CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); INSERT OVERWRITE DIRECTORY 's3://bucketname/path/subpath/' SELECT * FROM hiveTableName;
Untuk mengekspor tabel DynamoDB ke bucket Amazon S3 menggunakan format
  • Buat tabel eksternal yang membuat referensi lokasi di Amazon S3. Hal ini ditunjukkan di bawah sebagai s3_export. Selama panggilan CREATE, tentukan baris format untuk tabel. Kemudian, ketika Anda menggunakan INSERT OVERWRITE untuk mengekspor data dari DynamoDB ke s3_export, data ditulis dalam format yang ditentukan. Pada contoh berikut, data ditulis sebagai nilai yang dipisahkan oleh koma (CSV).

    CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); CREATE EXTERNAL TABLE s3_export(a_col string, b_col bigint, c_col array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://bucketname/path/subpath/'; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;
Untuk mengekspor tabel DynamoDB ke bucket Amazon S3 tanpa menentukan pemetaan kolom
  • Membuat tabel Hive yang membuat referensi data yang disimpan dalam DynamoDB. Hal ini mirip dengan contoh sebelumnya, kecuali jika Anda tidak menentukan pemetaan kolom. Tabel harus benar-benar memiliki satu kolom tipe map<string, string>. Jika Anda kemudian membuat tabel EXTERNAL di Amazon S3 Anda dapat memanggil perintah INSERT OVERWRITE untuk menulis data dari DynamoDB ke Amazon S3. Anda dapat menggunakan ini untuk membuat arsip data DynamoDB Anda di Amazon S3. Karena tidak ada pemetaan kolom, Anda tidak dapat melakukan kueri pada tabel yang diekspor dengan cara ini. Mengekspor data tanpa menentukan pemetaan kolom tersedia di Hive 0.8.1.5 atau setelahnya, yang didukung di Amazon EMR AMI 2.2.x dan setelahnya.

    CREATE EXTERNAL TABLE hiveTableName (item map<string,string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1"); CREATE EXTERNAL TABLE s3TableName (item map<string, string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://bucketname/path/subpath/'; INSERT OVERWRITE TABLE s3TableName SELECT * FROM hiveTableName;
Untuk mengekspor tabel DynamoDB ke bucket Amazon S3 menggunakan kompresi data
  • Hive menyediakan beberapa codec kompresi yang dapat Anda atur selama sesi Hive Anda. Melakukan hal tersebut akan menyebabkan data yang diekspor dikompresi dalam format yang ditentukan. Contoh berikut mengkompresi file yang diekspor menggunakan algoritme Lempel-Ziv-Oberhumer (LZO).

    SET hive.exec.compress.output=true; SET io.seqfile.compression.type=BLOCK; SET mapred.output.compression.codec = com.hadoop.compression.lzo.LzopCodec; CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); CREATE EXTERNAL TABLE lzo_compression_table (line STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://bucketname/path/subpath/'; INSERT OVERWRITE TABLE lzo_compression_table SELECT * FROM hiveTableName;

    Codec kompresi yang tersedia adalah:

    • org.apache.hadoop.io.compress. GzipCodec

    • org.apache.hadoop.io.compress. DefaultCodec

    • com.hadoop.compression.lzo. LzoCodec

    • com.hadoop.compression.lzo. LzopCodec

    • org.apache.hadoop.io.compress.BZip2Codec

    • org.apache.hadoop.io.compress. SnappyCodec

Untuk mengekspor tabel DynamoDB ke HDFS
  • Gunakan perintah Hive berikut, di mana hdfs: ///directoryName adalah path HDFS valid dan hiveTableNametabel di Hive yang membuat referensi DynamoDB. Operasi ekspor ini lebih cepat daripada mengekspor tabel DynamoDB ke Amazon S3 karena Hive 0.7.1.1 menggunakan HDFS sebagai langkah lanjutan ketika mengekspor data ke Amazon S3. Contoh berikut juga menunjukkan cara untuk mengatur dynamodb.throughput.read.percent menjadi 1,0 untuk meningkatkan tingkat permintaan baca.

    CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); SET dynamodb.throughput.read.percent=1.0; INSERT OVERWRITE DIRECTORY 'hdfs:///directoryName' SELECT * FROM hiveTableName;

    Anda juga dapat mengekspor data ke HDFS menggunakan format dan kompresi seperti yang ditunjukkan di atas untuk ekspor ke Amazon S3. Untuk melakukannya, cukup ganti direktori Amazon S3 dalam contoh di atas dengan direktori HDFS.

Untuk membaca data karakter UTF-8 yang tidak dapat dicetak di Hive
  • Anda dapat membaca dan menulis data karakter UTF-8 yang tidak dapat dicetak dengan Hive dengan menggunakan klausul STORED AS SEQUENCEFILE saat Anda membuat tabel. A SequenceFile adalah format file biner Hadoop; Anda perlu menggunakan Hadoop untuk membaca file ini. Contoh berikut menunjukkan cara mengekspor data dari DynamoDB ke Amazon S3. Anda dapat menggunakan fungsionalitas ini untuk menangani karakter dikodekan UTF-8 yang tidak dapat dicetak.

    CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); CREATE EXTERNAL TABLE s3_export(a_col string, b_col bigint, c_col array<string>) STORED AS SEQUENCEFILE LOCATION 's3://bucketname/path/subpath/'; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;

Mengimpor data ke DynamoDB

Ketika Anda menulis data ke DynamoDB menggunakan Hive Anda harus memastikan bahwa jumlah unit kapasitas tulis lebih besar dari jumlah pemeta di klaster. Sebagai contoh, klaster yang berjalan pada instans EC2 m1.xlarge menghasilkan 8 pemeta per instans. Dalam kasus klaster yang memiliki 10 instans, itu berarti ada total 80 pemeta. Jika unit kapasitas tulis Anda tidak lebih besar dari jumlah pemeta di klaster, operasi tulis Hive dapat menghabiskan semua throughput tulis, atau mencoba untuk menghabiskan throughput lebih dari yang ditetapkan. Untuk informasi selengkapnya tentang jumlah pemeta yang dihasilkan oleh setiap tipe instans EC2, lihat Konfigurasikan Hadoop.

Jumlah pemeta di Hadoop dikendalikan oleh perpecahan masukan. Jika ada terlalu sedikit perpecahan, perintah tulis Anda mungkin tidak dapat menghabiskan semua throughput tulis yang tersedia.

Jika item dengan kunci yang sama ada di tabel DynamoDB target, maka item itu akan ditimpa. Jika tidak ada item dengan kunci yang ada di tabel DynamoDB target, maka item itu akan dimasukkan.

Untuk mengimpor tabel dari Amazon S3 ke DynamoDB
  • Anda dapat menggunakan Amazon EMR (Amazon EMR) dan Hive untuk menulis data dari Amazon S3 ke DynamoDB.

    CREATE EXTERNAL TABLE s3_import(a_col string, b_col bigint, c_col array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://bucketname/path/subpath/'; CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); INSERT OVERWRITE TABLE hiveTableName SELECT * FROM s3_import;
Untuk mengimpor tabel dari bucket Amazon S3 untuk DynamoDB tanpa menentukan pemetaan kolom
  • Buat tabel EXTERNAL yang membuat referensi data yang disimpan di Amazon S3 yang sebelumnya diekspor dari DynamoDB. Sebelum mengimpor, pastikan bahwa tabel ada di DynamoDB dan bahwa tabel tersebut memiliki skema kunci yang sama seperti tabel DynamoDB yang sebelumnya diekspor. Selain itu, tabel harus memiliki tepat satu kolom tipe map<string, string>. Jika Anda kemudian membuat tabel Hive yang terkait dengan DynamoDB, Anda dapat memanggil perintah INSERT OVERWRITE untuk menulis data dari Amazon S3 ke DynamoDB. Karena tidak ada pemetaan kolom, Anda tidak dapat melakukan kueri tabel yang diimpor dengan cara ini. Mengimpor data tanpa menentukan pemetaan kolom tersedia di Hive 0.8.1.5 atau setelahnya, yang didukung di Amazon EMR AMI 2.2.3 dan setelahnya.

    CREATE EXTERNAL TABLE s3TableName (item map<string, string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://bucketname/path/subpath/'; CREATE EXTERNAL TABLE hiveTableName (item map<string,string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1"); INSERT OVERWRITE TABLE hiveTableName SELECT * FROM s3TableName;
Untuk mengimpor tabel dari HDFS ke DynamoDB
  • Anda dapat menggunakan Amazon EMR dan Hive untuk menulis data dari HDFS ke DynamoDB.

    CREATE EXTERNAL TABLE hdfs_import(a_col string, b_col bigint, c_col array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 'hdfs:///directoryName'; CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); INSERT OVERWRITE TABLE hiveTableName SELECT * FROM hdfs_import;

Melakukan kueri data dalam DynamoDB

Contoh berikut menunjukkan berbagai cara untuk menggunakan Amazon EMR untuk melakukan kueri data yang disimpan di DynamoDB.

Untuk menemukan nilai terbesar untuk kolom dipetakan (max)
  • Gunakan perintah Hive seperti berikut. Pada perintah pertama, pernyataan CREATE menciptakan tabel Hive yang membuat referensi data yang disimpan dalam DynamoDB. Pernyataan SELECT kemudian menggunakan tabel itu untuk melakukan kueri data yang disimpan dalam DynamoDB. Contoh berikut menemukan pesanan terbesar yang ditempatkan oleh pelanggan tertentu.

    CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Purchases", "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items"); SELECT max(total_cost) from hive_purchases where customerId = 717;
Untuk menggabungkan data menggunakan klausul GROUP BY
  • Anda dapat menggunakan klausul GROUP BY untuk mengumpulkan data di beberapa catatan. Hal ini sering kali digunakan dengan fungsi agregat seperti sum, count, min, atau max. Contoh berikut mengembalikan daftar pesanan terbesar dari pelanggan yang telah menempatkan lebih dari tiga pesanan.

    CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Purchases", "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items"); SELECT customerId, max(total_cost) from hive_purchases GROUP BY customerId HAVING count(*) > 3;
Untuk menggabungkan dua tabel DynamoDB
  • Contoh berikut memetakan dua tabel Hive ke data yang disimpan dalam DynamoDB. Ia kemudian memanggil gabungan di dua tabel itu. Gabungan dikomputasi pada klaster dan dikembalikan. Gabungan tidak terjadi di DynamoDB. Contoh ini mengembalikan daftar pelanggan dan pembelian mereka untuk pelanggan yang telah menempatkan lebih dari dua pesanan.

    CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Purchases", "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items"); CREATE EXTERNAL TABLE hive_customers(customerId bigint, customerName string, customerAddress array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Customers", "dynamodb.column.mapping" = "customerId:CustomerId,customerName:Name,customerAddress:Address"); Select c.customerId, c.customerName, count(*) as count from hive_customers c JOIN hive_purchases p ON c.customerId=p.customerId GROUP BY c.customerId, c.customerName HAVING count > 2;
Untuk menggabungkan dua tabel dari sumber yang berbeda
  • Pada contoh berikut, Customer_S3 adalah tabel Hive yang memuat file CSV yang disimpan di Amazon S3 dan hive_purchase adalah tabel yang membuat referensi data di DynamoDB. Contoh berikut menggabungkan data pelanggan yang disimpan sebagai file CSV di Amazon S3 dengan data pesanan yang disimpan di DynamoDB untuk mengembalikan satu set data yang mewakili pesanan yang ditempatkan oleh pelanggan yang terdapat kata "Miller" dalam nama mereka.

    CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Purchases", "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items"); CREATE EXTERNAL TABLE Customer_S3(customerId bigint, customerName string, customerAddress array<String>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://bucketname/path/subpath/'; Select c.customerId, c.customerName, c.customerAddress from Customer_S3 c JOIN hive_purchases p ON c.customerid=p.customerid where c.customerName like '%Miller%';
catatan

Dalam contoh sebelumnya, pernyataan CREATE TABLE disertakan dalam setiap contoh agar jelas dan lengkap. Ketika menjalankan beberapa kueri atau operasi ekspor terhadap tabel Hive tertentu, Anda hanya perlu membuat tabel satu kali, yakni pada awal sesi Hive.