DynamoDB 内データのエクスポート、インポート、クエリを行う Hive コマンドの使用例 - Amazon EMR

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

DynamoDB 内データのエクスポート、インポート、クエリを行う Hive コマンドの使用例

次の例では、Hive コマンドを使用して、Amazon S3 または へのデータのエクスポートHDFS、DynamoDB へのデータのインポート、テーブルの結合、テーブルのクエリなどのオペレーションを実行します。

Hive テーブルに対する操作では、DynamoDB に格納されているデータを参照します。Hive コマンドは、DynamoDB テーブルに設定されたスループット設定の制約を受けます。また、取得されるデータには、Hive 操作リクエストが DynamoDB で処理された時点で DynamoDB テーブルに書き込まれているデータが含まれます。データ取得プロセスに時間がかかる場合、Hive コマンドによって返されたデータには、Hive コマンドの開始後に DynamoDB で更新されたものが含まれる可能性があります。

Hive コマンドの DROP TABLECREATE TABLE は、Hive のローカルテーブルにのみ作用し、DynamoDB のテーブルの作成または削除は行いません。Hive クエリが DynamoDB のテーブルを参照する場合、そのテーブルは、クエリを実行する前に存在している必要があります。DynamoDB でのテーブルの作成と削除の詳細については、「Amazon DynamoDB デベロッパーガイド」の「DynamoDB のテーブルの操作」を参照してください。

注記

Hive テーブルを Amazon S3 内の場所にマッピングする場合、バケットのルートパス (s3://amzn-s3-demo-bucket) にはマッピングしないでください。これを行うと、Hive がデータを Amazon S3 に書き込むときにエラーが発生することがあります。代わりに、テーブルをバケットのサブパス(s3://amzn-s3-demo-bucket/mypath)にマッピングします。

DynamoDB からデータをエクスポートする

Hive を使用して DynamoDB のデータをエクスポートすることができます。

DynamoDB テーブルを Amazon S3 バケットにエクスポートするには
  • DynamoDB に格納されたデータを参照する Hive テーブルを作成します。その後、 INSERT OVERWRITE コマンドを呼び出して、外部ディレクトリにデータを書き込むことができます。次の例では、 s3://amzn-s3-demo-bucket/path/subpath/は Amazon S3 の有効なパスです。CREATE コマンドの列とデータ型を DynamoDB の値と一致するように調整します。これを使用して DynamoDB データのアーカイブを 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://amzn-s3-demo-bucket/path/subpath/' SELECT * FROM hiveTableName;
書式設定を使用して DynamoDB テーブルを Amazon S3 バケットにエクスポートするには
  • Amazon S3 内の場所を参照する外部テーブルを作成します。これは次の例では s3_export です。CREATE 呼び出し中に、テーブルの行フォーマットを指定します。次に、 INSERTOVERWRITEを使用して DynamoDB から s3_export にデータをエクスポートすると、データは指定された形式で書き出されます。次の例では、データはカンマ区切り値 () として書き込まれます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://amzn-s3-demo-bucket/path/subpath/'; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;
列のマッピングを指定せずに DynamoDB テーブルを Amazon S3 バケットにエクスポートするには
  • DynamoDB に格納されたデータを参照する Hive テーブルを作成します。これは、カラムマッピングを指定しないこと以外、前の例とほぼ同じです。このテーブルには map<string, string> 型の列が 1 つだけ含まれている必要があります。次に、Amazon S3 に EXTERNAL テーブルを作成したら、INSERT OVERWRITE コマンドを呼び出して DynamoDB のデータを Amazon S3 に書き込みます。これを使用して DynamoDB データのアーカイブを Amazon S3 に作成できます。カラムマッピングがないので、この方法でエクスポートされたテーブルをクエリすることはできません。列マッピングを指定せずにデータをエクスポートすることは、Amazon 2.2.x 以降でサポートされている Hive 0.8.1.5 EMR AMI 以降で使用できます。

    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://amzn-s3-demo-bucket/path/subpath/'; INSERT OVERWRITE TABLE s3TableName SELECT * FROM hiveTableName;
データ圧縮を使用して DynamoDB テーブルを Amazon S3 バケットにエクスポートするには
  • Hive では、Hive セッション中に設定できる圧縮コーデックが複数あります。これを行うことで、エクスポートデータは、指定した形式で圧縮されます。次の例では、 (LZO) アルゴリズムを使用してエクスポートされた Lempel-Ziv-Oberhumerファイルを圧縮します。

    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://amzn-s3-demo-bucket/path/subpath/'; INSERT OVERWRITE TABLE lzo_compression_table SELECT * FROM hiveTableName;

    以下の圧縮コーデックを利用できます。

    • 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

DynamoDB テーブルを にエクスポートするには HDFS
  • 次の Hive コマンドを使用します。ここで、 hdfs:///directoryNameは有効なHDFSパスで、 hiveTableNameは DynamoDB を参照する Hive のテーブルです。Hive 0.7.1.1 は Amazon S3 にデータをエクスポートする際の中間ステップHDFSとして を使用するため、このエクスポートオペレーションは DynamoDB テーブルを Amazon S3 にエクスポートするよりも高速です。また、次の例は、dynamodb.throughput.read.percent を 1.0 に設定して読み取りリクエストレートを上げる方法を示しています。

    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;

    Amazon S3 へのエクスポートでは、上記のようにフォーマットと圧縮HDFSを使用してデータを にエクスポートすることもできます。 Amazon S3 そのためには、上記の例の Amazon S3 ディレクトリを HDFS ディレクトリに置き換えるだけです。

Hive で印刷不可能な UTF-8 文字データを読み取るには
  • テーブルの作成時に STORED AS SEQUENCEFILE句を使用して、印刷不可能な UTF-8 文字のデータを Hive で読み書きできます。 SequenceFile は Hadoop バイナリファイル形式です。このファイルを読み取るには Hadoop を使用する必要があります。次の例に、DynamoDB から Amazon S3 にデータをエクスポートする方法を示します。この機能を使用して、印刷不可能な UTF-8 エンコード文字を処理できます。

    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://amzn-s3-demo-bucket/path/subpath/'; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;

DynamoDB へのデータのアップロード

Hive を使用してデータを DynamoDB に書き込む場合は、書き込み容量単位の数をクラスター内のマッパーの数より大きいことを確認する必要があります。例えば、m1.xlarge EC2インスタンスで実行されるクラスターは、インスタンスごとに 8 つのマッパーを生成します。10 個のインスタンスがあるクラスターの場合は、合計 80 個のマッパーがあることになります。書き込み容量単位がクラスター内のマッパーの数以下である場合、Hive の書き込み操作は書き込みスループットを消費しきるか、プロビジョニングされた以上のスループットを消費しようとします。各EC2インスタンスタイプによって生成されるマッパーの数の詳細については、「」を参照してくださいHadoop の設定

Hadoop 内のマッパーの数は入力分割数によって決まります。分割数が少なすぎる場合、書き込みコマンドは書き込みスループットを消費しきれない可能性があります。

同じキーを持つ項目がターゲット DynamoDB テーブルに存在する場合、項目は上書きされます。キーを持つ項目がターゲット DynamoDB テーブルに存在しない場合、その項目は挿入されます。

Amazon S3 のテーブルを DynamoDB にインポートするには
  • Amazon EMR (Amazon EMR) と Hive を使用して、Amazon S3 から DynamoDB にデータを書き込むことができます。

    CREATE EXTERNAL TABLE s3_import(a_col string, b_col bigint, c_col array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://amzn-s3-demo-bucket/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;
カラムマッピングを指定せずに Amazon S3 バケットのテーブルを DynamoDB にインポートするには
  • 以前 DynamoDB からエクスポートされ Amazon S3 に格納されたデータを参照する EXTERNAL テーブルを作成します。インポートする前に、テーブルが DynamoDB に存在することと、そのキースキーマが、以前エクスポートされた DynamoDB テーブルと同じであることを確認します。また、テーブルには map<string, string> 方の列が 1 つだけ含まれる必要があります。次に、DynamoDB にリンクされている Hive テーブルを作成したら、INSERT OVERWRITE コマンドを呼び出して Amazon S3 のデータを DynamoDB に書き込みます。カラムマッピングがないので、この方法でインポートされたテーブルにクエリを行うことはできません。列マッピングを指定せずにデータをインポートすることは、Amazon 2.2.3 以降でサポートされている Hive 0.8.1.5 EMR AMI 以降で使用できます。

    CREATE EXTERNAL TABLE s3TableName (item map<string, string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://amzn-s3-demo-bucket/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;
から DynamoDB HDFSにテーブルをインポートするには
  • Amazon EMRと Hive を使用して、 から DynamoDB HDFSにデータを書き込むことができます。

    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;

DynamoDB 内データのクエリ

次の例は、Amazon を使用して DynamoDB に保存されているデータをEMRクエリするさまざまな方法を示しています。

マッピングされたカラムで最大値を検索するには(max
  • 次のような Hive コマンドを使用します。最初のコマンドでは、 CREATEステートメントは DynamoDB に保存されているデータを参照する Hive テーブルを作成します。次に、 SELECTステートメントはそのテーブルを使用して、DynamoDB に保存されているデータをクエリします。次の例では、指定された顧客による最大の注文を検索します。

    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;
GROUP BY 句を使用してデータを集計するには
  • GROUP BY 句を使用して、複数のレコードのデータを収集できます。多くの場合、これは sum、count、min、または max のような集計関数とともに使用されます。次の例は、4 件以上注文した顧客の注文のうち最大の注文のリストを返します。

    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;
2 つの DynamoDB テーブルを結合するには
  • 次の例では、2 つの Hive テーブルを DynamoDB に格納されているデータにマッピングします。その後、2 つのテーブルに対して join を呼び出します。結合はクラスターで計算され、以下を返します。結合は DynamoDB 内では発生しません。この例は、3 件以上注文した顧客について、顧客とその購入品のリストを返します。

    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;
異なるソースの 2 つのテーブルを結合するには
  • 次の例では、Customer_S3 は Amazon S3 に保存されているCSVファイルをロードする Hive テーブルで、hive_purchases は DynamoDB のデータを参照するテーブルです。次の例では、Amazon S3 にCSVファイルとして保存されている顧客データと DynamoDB に保存された注文データを結合して、名前に「ミラー」がある顧客からの注文を表す一連のデータを返します。

    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://amzn-s3-demo-bucket/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%';
注記

前述の例では、明確さと完全性のためにCREATETABLE、ステートメントが各例に含まれていました。指定された Hive テーブルに対して複数のクエリやエクスポート操作を実行する場合は、Hive セッションの開始時にテーブルを一度作成するだけで済みます。