列指向形式への変換 - Amazon Athena

列指向形式への変換

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

注記

CREATE TABLE AS (CTAS) クエリを使用して、Parquet および ORC などの列指向形式への変換をワンステップで実行します。

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

Overview

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

  1. Hive がインストールされた EMR クラスターを作成します。

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

    注記

    このスクリプトは Amazon EMR バージョン 4.7 に基づいており、現在のバージョンに更新される必要があります。バージョンの詳細については、Amazon EMR リリースガイドを参照してください。

    完全なスクリプト全体は、以下の Amazon S3 にあります。

    s3://athena-examples-myregion/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://MyRegion.elasticmapreduce/samples/hive-ads/tables/impressions/' ;
    注記

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

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

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

    { "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;

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

    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 クラスターを作成する必要があります。Amazon EMR の詳細については、Amazon EMR 管理ガイドを参照してください。

  • セットアップ」に記載されている手順に従います。

例: 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-west-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=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 Management Console を使用するか、AWS CLI でクラスター ID と list-steps サブコマンドを使用して、クラスターの進捗状況をモニタリングします。

    aws emr list-steps --cluster-id myClusterID

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

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

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

    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] (カタログ) でテーブル名の横にある表示 (目) アイコンを選択することもできます。

    これにより、次のような出力が表示されます。