Amazon Athena
ユーザーガイド

列指向形式への変換

データをオープンソースの列指向形式 (Apache ParquetORC など) に変換すると、Amazon Athena のクエリパフォーマンスが向上します。

これを既存の Amazon S3 のデータソースに対して行うには、Amazon EMR でクラスターを作成し、それを Hive を使用して変換します。以下の AWS CLI を使用した例では、スクリプトと Amazon S3 に保存されたデータを使用して、この変換方法を示しています。

概要

EMR クラスターを使用して列指向形式に変換するプロセスは、以下のとおりです。

  1. Hive をインストール済みの EMR クラスターを作成します。

  2. cluster create ステートメントの step セクションで、Amazon S3 内の保存されたスクリプトを指定して入力データをポイントし、Amazon S3 の場所に出力データを列指向形式で作成します。この例のクラスターは自動終了します。

    スクリプト全体は Amazon S3 の以下の場所にあります。

    s3://athena-examples/conversion/write-parquet-to-s3.q

    以下に、CREATE TABLE スニペットで始まるスクリプトの例を示します。

    ADD JAR /usr/lib/hive-hcatalog/share/hcatalog/hive-hcatalog-core-1.0.0-amzn-5.jar; CREATE EXTERNAL TABLE impressions ( requestBeginTime string, adId string, impressionId string, referrer string, userAgent string, userCookie string, ip string, number string, processId string, browserCookie string, requestEndTime string, timers struct<modelLookup:string, requestTime:string>, threadId string, hostname string, sessionId string) PARTITIONED BY (dt string) ROW FORMAT serde 'org.apache.hive.hcatalog.data.JsonSerDe' with serdeproperties ( 'paths'='requestBeginTime, adId, impressionId, referrer, userAgent, userCookie, ip' ) LOCATION 's3://${REGION}.elasticmapreduce/samples/hive-ads/tables/impressions' ;

    注記

    LOCATION 句の REGION は、クエリを実行するリージョンに置き換えてください。たとえば、コンソールが us-east-1 にある場合、REGIONs3://us-east-1.elasticmapreduce/samples/hive-ads/tables/ とします。

    これにより、クラスターの Hive にテーブルが作成され、Amazon EMR サンプルバケットにあるサンプルが使用されます。

  3. Amazon EMR リリース 4.7.0 で、適切な JsonSerDe を見つけるには ADD JAR 行を追加します。 整形したサンプルデータは次のようになります。

    { "number": "977680", "referrer": "fastcompany.com", "processId": "1823", "adId": "TRktxshQXAHWo261jAHubijAoNlAqA", "browserCookie": "mvlrdwrmef", "userCookie": "emFlrLGrm5fA2xLFT5npwbPuG7kf6X", "requestEndTime": "1239714001000", "impressionId": "1I5G20RmOuG2rt7fFGFgsaWk9Xpkfb", "userAgent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506; InfoPa", "timers": { "modelLookup": "0.3292", "requestTime": "0.6398" }, "threadId": "99", "ip": "67.189.155.225", "modelId": "bxxiuxduad", "hostname": "ec2-0-51-75-39.amazon.com", "sessionId": "J9NOccA3dDMFlixCuSOtl9QBbjs6aS", "requestBeginTime": "1239714000000" }
  4. Hive で、パーティションからデータをロードし、スクリプトで以下を実行します。

    MSCK REPAIR TABLE impressions;

    次に、スクリプトはテーブルを作成し、データを Parquet 形式ファイルで Amazon S3 に保存します。

    CREATE EXTERNAL TABLE parquet_hive ( requestBeginTime string, adId string, impressionId string, referrer string, userAgent string, userCookie string, ip string ) STORED AS PARQUET LOCATION 's3://myBucket/myParquet/';

    データは、impressions テーブルから parquet_hive 内に挿入されます。

    INSERT OVERWRITE TABLE parquet_hive SELECT requestbegintime, adid, impressionid, referrer, useragent, usercookie, ip FROM impressions WHERE dt='2009-04-14-04-05';

    スクリプトでは、上の impressions テーブルで日付 2009-04-14-04-05 以降の列を Parquet 形式ファイルの s3://myBucket/myParquet/ に保存します。

  5. EMR クラスターが終了したら、Athena でテーブルを作成し、このクラスターで生成した形式のデータを使用します。

開始する前に

例: EMR クラスターを使用してデータを Parquet に変換する

  1. AWS CLI を使用してクラスターを作成します。AWS CLI をインストールする必要がある場合は、AWS Command Line Interface ユーザーガイドの「AWS Command Line Interface のインストール」を参照してください。

  2. Amazon EMR を使用するにはロールが必要です。以前に Amazon EMR を使用したことがない場合は、次のコマンドを使用してデフォルトのロールを作成します。

    aws emr create-default-roles
  3. emr-4.7.0 リリースを使用して Amazon EMR クラスターを作成し、次の AWS CLI emr create-cluster コマンドを使用してデータを変換します。

    export REGION=us-east-1 export SAMPLEURI=s3://${REGION}.elasticmapreduce/samples/hive-ads/tables/impressions/ export S3BUCKET=myBucketName aws emr create-cluster --applications Name=Hadoop Name=Hive Name=HCatalog \ --ec2-attributes KeyName=myKey,InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-mySubnetId \ --service-role EMR_DefaultRole --release-label emr-4.7.0 --instance-type \m4.large --instance-count 1 --steps Type=HIVE,Name="Convert to Parquet",\ ActionOnFailure=CONTINUE, ActionOnFailure=TERMINATE_CLUSTER, Args=[-f, \s3://athena-examples/conversion/write-parquet-to-s3.q,-hiveconf, INPUT=${SAMPLEURI},-hiveconf, OUTPUT=s3://${S3BUCKET}/myParquet,-hiveconf, REGION=${REGION} ] \ --region ${REGION} --auto-terminate

    詳細については、Amazon EMR 管理ガイド の「Amazon EMR の IAM ロールの作成と使用」を参照してください。

    リクエストが成功すると、クラスター ID が提供されます。

  4. AWS マネジメントコンソールを使用するか、AWS CLI でクラスター ID と list-steps サブコマンドを使用して、クラスターの進捗状況をモニタリングします。

    aws emr list-steps --cluster-id myClusterID

    スクリプトでステップのステータスを確認します。COMPLETED の場合は、変換が完了済みであり、データのクエリを実行する準備が整っています。

  5. EMR クラスターで作成したのと同じテーブルを作成します。

    上と同じステートメントを使用できます。Athena にログインし、このステートメントを [クエリエディタ] ウィンドウに入力します。

    CREATE EXTERNAL TABLE parquet_hive ( requestBeginTime string, adId string, impressionId string, referrer string, userAgent string, userCookie string, ip string ) STORED AS PARQUET LOCATION 's3://myBucket/myParquet/';

    [Run Query] を選択します。

  6. 次のクエリを実行し、このデータをクエリできることを確認します。

    SELECT * FROM parquet_hive LIMIT 10;

    または、[Catalog] でテーブル名の横にある表示 (目) アイコンを選択することもできます。

    結果として、次のような出力が表示されます。