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 melakukan operasi seperti mengekspor data ke Amazon S3 HDFS atau, mengimpor data ke DynamoDB, menggabungkan tabel, menanyakan 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

Saat Anda memetakan tabel Hive ke lokasi di Amazon S3, jangan memetakannya ke jalur root bucket, s3://amzn-s3-demo-bucket, karena ini dapat menyebabkan kesalahan saat Hive menulis data ke Amazon S3. Alih-alih memetakan tabel ke subpath bucket, s3://amzn-s3-demo-bucket/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 INSERT OVERWRITE perintah untuk menulis data ke direktori eksternal. Dalam contoh berikut, s3://bucketname/path/subpath/ adalah jalur yang valid di Amazon S3. Sesuaikan kolom dan tipe data dalam CREATE perintah agar sesuai dengan nilai di 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 CREATE panggilan, tentukan pemformatan baris untuk tabel. Kemudian, ketika Anda menggunakan INSERT OVERWRITE untuk mengekspor data dari DynamoDB ke s3_export, data ditulis dalam format yang ditentukan. Dalam contoh berikut, data ditulis sebagai nilai dipisahkan 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 yang lebih baru, yang didukung di Amazon 2.2. EMR AMI x dan kemudian.

    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 mengompres file yang diekspor menggunakan algoritma 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 HDFS jalan yang valid dan hiveTableName adalah tabel di Hive yang mereferensikan DynamoDB. Operasi ekspor ini lebih cepat daripada mengekspor tabel DynamoDB ke Amazon S3 karena Hive 0.7.1.1 HDFS digunakan sebagai langkah perantara saat 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 HDFS menggunakan pemformatan dan kompresi seperti yang ditunjukkan di atas untuk ekspor ke Amazon S3. Untuk melakukannya, cukup ganti direktori Amazon S3 pada 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 STORED AS SEQUENCEFILE klausa 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 fungsi ini untuk menangani karakter UTF -8 yang disandikan 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. Misalnya, cluster yang berjalan pada instance m1.xlarge menghasilkan 8 mapper EC2 per instance. 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 lebih lanjut tentang jumlah mapper yang dihasilkan oleh setiap jenis EC2 instance, lihatKonfigurasikan 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 (AmazonEMR) 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 yang lebih baru, yang didukung di Amazon 2.2.3 dan yang lebih baru. EMR AMI

    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 DynamoDB
  • Anda dapat menggunakan Amazon EMR dan Hive untuk menulis data dari HDFS 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;

Mengkueri data di DynamoDB

Contoh berikut menunjukkan berbagai cara Anda dapat menggunakan Amazon EMR untuk menanyakan data yang disimpan di DynamoDB.

Untuk menemukan nilai terbesar untuk kolom dipetakan (max)
  • Gunakan perintah Hive seperti berikut. Pada perintah pertama, CREATE pernyataan membuat tabel Hive yang mereferensikan data yang disimpan di DynamoDB. SELECTPernyataan tersebut kemudian menggunakan tabel tersebut untuk kueri data yang disimpan di 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
  • Dalam contoh berikut, Customer_S3 adalah tabel Hive yang memuat file yang disimpan CSV di Amazon S3 dan hive_purchases adalah tabel yang mereferensikan data di DynamoDB. Contoh berikut menggabungkan data pelanggan yang disimpan sebagai CSV file di Amazon S3 dengan data pesanan yang disimpan di DynamoDB untuk mengembalikan sekumpulan data yang mewakili pesanan yang ditempatkan oleh pelanggan yang memiliki “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, CREATE TABLE pernyataan dimasukkan dalam setiap contoh untuk kejelasan dan kelengkapan. Ketika menjalankan beberapa kueri atau operasi ekspor terhadap tabel Hive tertentu, Anda hanya perlu membuat tabel satu kali, yakni pada awal sesi Hive.