2

バックアップの手段として (EMR 経由で) DynamoDB テーブルを s3 にエクスポートします。エクスポートするときは、データを lzo 圧縮ファイルとして保存します。私のハイブ クエリは以下のとおりですが、基本的にはhttp://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/EMR_Hive_Commands.htmlの「データ圧縮を使用して Amazon DynamoDB テーブルを Amazon S3 バケットにエクスポートするには」に従いました。

逆のことをしたいのですが、LZOファイルを取得して、それらをハイブテーブルに戻します。これどうやってやるの?入力用のハイブ構成プロパティが表示されることを期待していましたが、ありません。私はググっていくつかのヒントを見つけましたが、決定的なものも機能するものもありません。

s3 のファイルの形式は次のとおりです: s3://[mybucket]/backup/year=2012/month=08/day=01/000000.lzo

エクスポートを行う HQL は次のとおりです。

SET dynamodb.throughput.read.percent=1.0;
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 hiveSBackup (id bigint, periodStart string, allotted bigint, remaining bigint, created string, seconds bigint, served bigint, modified string)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
TBLPROPERTIES ("dynamodb.table.name" = "${DYNAMOTABLENAME}", 
"dynamodb.column.mapping" = "id:id,periodStart:periodStart,allotted:allotted,remaining:remaining,created:created,seconds:seconds,served:served,modified:modified");

CREATE EXTERNAL TABLE s3_export (id bigint, periodStart string, allotted bigint, remaining bigint, created string, seconds bigint, served bigint, modified string)
 PARTITIONED BY (year string, month string, day string)
 ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
 LOCATION 's3://<mybucket>/backup';

INSERT OVERWRITE TABLE s3_export
 PARTITION (year="${PARTITIONYEAR}", month="${PARTITIONMONTH}", day="${PARTITIONDAY}")
 SELECT * from hiveSBackup;

s3から取得し、解凍して、ハイブテーブルに入れる方法はありますか??

4

1 に答える 1

6

EMR 上の Hive は、S3 から直接データをネイティブに読み取ることができるため、何もインポートする必要はありません。外部テーブルを作成し、データの場所を指定するだけです。また、lzo サポートのセットアップもあります。ファイルが .lzo 拡張子で終わる場合、Hive は lzo を使用して自動的に解凍します。

したがって、s3 の lzo データをハイブに「インポート」するには、lzo 圧縮データ s3 を指す外部テーブルを作成するだけで、ハイブはクエリを実行するたびにそれを解凍します。データを「エクスポート」したときとほぼ同じです。その s3_export テーブルから読み取ることもできます。

外部テーブル以外にインポートしたい場合は、上書きを新しいテーブルに挿入し、外部テーブルから選択するだけです。

私があなたの質問を誤解していて、ハイブテーブルだけでなく、ダイナモへのインポートについて尋ねるつもりでない限り?

This is what I've been doing
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 users
(id int, username string, firstname string, surname string, email string, birth_date string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION 's3://bucket/someusers';

INSERT OVERWRITE TABLE users
SELECT * FROM someothertable;

最終的に、s3://bucket/someusers の下に、ハイブで読み取り可能な .lzo 拡張子を持つ一連のファイルが作成されます。

圧縮データを書き込もうとするときにのみコーデックを設定する必要があり、それを読み取ると、圧縮が自動的に検出されます。

于 2012-09-13T18:13:50.997 に答える